17

我对 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”和“name”列进行排序。

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

SELECT * FROM games ORDER BY name ASC

但是如何对 id 列的值进行排序并将更改保存在表中?请帮忙。

4

7 回答 7

27

您将不得不使用第二张桌子

  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`;
    

这些步骤将产生您想要的结果。

于 2012-04-09T21:05:23.810 回答
4

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

SELECT UnsortedId = id
, SortedId = ROW_NUMBER() OVER (ORDER BY g.name, g.id)
FROM games 
于 2012-04-09T21:21:30.687 回答
3

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

mysql> ALTER TABLE games ORDER BY name asc;

就这样 !

于 2017-01-12T23:58:43.167 回答
1

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

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

然后使用删除游戏桌,

    drop table games;

现在再次使用与 new 相同的属性和数据创建游戏表(此处排序是可选的)使用,

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

现在删除临时表“新”

    drop table new;

现在检查你的桌子。必须对其进行整理。

于 2016-02-02T08:37:15.170 回答
0

您可以同时对两个字段进行排序。

SELECT *
FROM games
ORDER BY id DESC, name ASC

我不明白您在表格中保存更改是什么意思。,ORDER BY只是更改您正在查看的显示它不会更改表中的数据,除非您执行UPDATE.

如果你对 SQL 不熟悉,网上有很多教程可以提供帮助:

SQL 课程

初级 SQL 教程

SQL 教程 - 学习 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
于 2012-04-09T20:59:48.670 回答
0

这是我的解决方法......愚蠢的简单:

  1. 提取到临时表

SELECT SortKeyValue (添加任何其他固定值,只是不包括现有序列) INTO #Temp FROM SourceTable;

  1. 清空表:

截断表源表

  1. 重新插入:

INSERT INTO SourceTable (SortKeyValue, DisplayOrder (plus other fields) ) SELECT SortKeyValue, ROW_NUMBER() OVER (ORDER BY SortKeyValue) AS DispOrd (plus other fields) FROM #Temp;

  1. 完毕!
于 2019-07-23T21:03:11.463 回答
-3

SQL> SELECT * FROM games ORDER BY ID,NAME;

于 2015-10-14T13:09:44.630 回答