如何对列中的值进行排序并更新表?

问题描述:

我完全不熟悉sql,不能自己做。所以我需要你的帮助。 我想对列中的值进行排序,然后保存更改。但我不知道该怎么做。如何对列中的值进行排序并更新表?

表看起来像这样:

Id | Name | SomeDescription 
--------------------------- 
1 |Best | Description1 
2 |Worth | Description2 
3 |Good | Description3 

我想类似的东西:

Id | Name | SomeDescription 
--------------------------- 
1 |Best | Description1 
2 |Good | Description3 
3 |Worth | Description2 

所以我需要梳理 “ID” 和 “名称” 列。

我用以下语句,“名称”列的值进行排序:

SELECT * FROM games ORDER BY name ASC 

但如何才能使我的id列的值进行排序并保存在表的变化? 请帮忙。

+3

当您对数据进行排序时,您不会更改数据,因此数据表永远不会以特定顺序返回数据。 – HLGEM 2012-04-09 20:59:14

+2

为什么要保存数据库表排序? – MarioDS 2012-04-09 21:02:30

+0

@MarioDeSchaepmeester这是一个悠久的历史。简而言之,我需要为我的应用程序。 – Sabre 2012-04-09 21:05:05

你将不得不使用第二台

  1. 创建新表games2具有相同的结构,你的games表,确保该ID自动递增

    CREATE TABLE `games2` LIKE `games`; 
    
  2. 复制资料排序,分为games2

    INSERT INTO `games2` (`Name`, `SomeDescription`) SELECT `Name`, `SomeDescription` FROM `games` ORDER BY `Name` 
    
  3. 拖放或移动旧表

    -- DROP TABLE `games`; 
    -- or 
    RENAME TABLE `games` TO `games1`; 
    
  4. 新表重命名为旧名称

    RENAME TABLE `games2` TO `games`; 
    

将导致你想要的这些步骤。

+3

太好了。非常感谢您的帮助! – Sabre 2012-04-09 21:10:12

+0

@Sabre&Umbrella Table实现/存储有序,但表是无序的抽象。在查询中获得订单的唯一方法是最外面的ORDER BY。 – philipxy 2017-08-28 21:23:58

您可以在两个字段上同时排序。

SELECT * 
FROM games 
ORDER BY id DESC, name ASC 

我不明白你的意思是保存表中的变化。 ORDER BY,只是改变显示器,你看它不会改变表中的数据,除非你执行UPDATE

如果你不熟悉SQL,还有很多在线教程,可以帮助:

SQL Course

Beginner SQL Tutorial

SQL Tutorial - Learn SQL

编辑基础上的评论,这可能是完成一步:

create table #temp 
(
    id int, 
    name varchar(50), 
    somedesc varchar(50) 
) 

insert into #temp values (1, 'best', 'desc1') 
insert into #temp values (2, 'worth', 'desc2') 
insert into #temp values (3, 'good', 'desc3') 

update t1 
SET t1.id = t2.rn 
    , t1.somedesc = t1.somedesc 
FROM #temp t1 
JOIN 
(
    select id, name, somedesc, row_number() over(order by name, id) as rn 
    from #temp 
) t2 
on t1.id = t2.id 

select * 
from #temp 
order by id 

drop table #temp 
+0

当然,你所说的是正确的,但注意他的例子中他想做的事情 - “Id”列保持不变。 – cha0site 2012-04-09 21:01:41

+0

我的意思是更新。我可以这样做吗? – Sabre 2012-04-09 21:02:10

+0

@ cha0site你是对的。当我以这种方式对两个字段进行排序时,我在表 – Sabre 2012-04-09 21:03:13

您可以使用ROW_NUMBER排序函数对行重新编号。

SELECT UnsortedId = id 
, SortedId = ROW_NUMBER() OVER (ORDER BY g.name, g.id) 
FROM games 
+0

谢谢,这对我也有帮助。 – Sabre 2012-04-09 21:33:10

SQL> SELECT * FROM游戏 ORDER BY ID,NAME;

+1

您能否详细说明您的答案,并添加关于您提供的解决方案的更多描述? – abarisone 2015-10-14 13:12:00

+0

它如何更新? – lU5er 2017-04-21 07:05:16

这很简单。只需使用一些代码。我试过这个,它正在工作。首先创建一个临时表,同时对值进行排序。

create table new as select * from games order by name; 

,然后使用拖放游戏桌,

drop table games; 

现在有相同的属性和数据作为新的(其中这里的排序是一个可选)再次使用创建的游戏桌,

create table games as select * from new order by name; 

现在放下临时表'新'

drop table new; 

现在检查你的表格。它必须被整理出来。

您可以使用更简单的alter table命令。

mysql> ALTER TABLE games ORDER BY name asc; 

就这样!