2012-04-09 43 views
11

我完全不熟悉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

回答

17

你將不得不使用第二臺

  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

0

您可以在兩個字段上同時排序。

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

4

您可以使用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

-2

SQL> SELECT * FROM遊戲 ORDER BY ID,NAME;

+1

您能否詳細說明您的答案,並添加關於您提供的解決方案的更多描述? – abarisone 2015-10-14 13:12:00

+0

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

0

這很簡單。只需使用一些代碼。我試過這個,它正在工作。首先創建一個臨時表,同時對值進行排序。

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; 

現在檢查你的表格。它必須被整理出來。

1

您可以使用更簡單的alter table命令。

mysql> ALTER TABLE games ORDER BY name asc; 

就這樣!

相關問題