2010-07-20 39 views
0

我有一個表:TestTable的,這個表只有一個字段:值,我插入相同DATAS:如何通過插入序列DESC命令數據?

value 
------------ 
ccc 
aa 
111 
bbb 
------------ 

我運行:

select * from TestTable 

可以顯示我的結果順序

ccc 
aa 
111 
bbb 

現在,我要得到這樣的結果DESC:

bbb 
111 
aa 
ccc 

如何創建這個sql?

select * from TestTable order by (by what?) DESC 

想你!

+2

最擅長http://stackoverflow.com/questions/1793147/sql-best-practice-to-deal-with-default-sort-order/1793162#1793162 – 2010-07-20 12:03:25

回答

4

沒有可以在訂單聲明中使用的自動「創建訂單」標識符。您應該使用auto_increment列爲您的記錄編號。然後您可以按該列排序。

MySQL docs on auto_increment

+0

+1似乎只有這樣解釋,它不可能將自定義排序提供程序注入到SQL中 - 因此無法在所討論的列上實現目標排序。 – 2010-07-20 11:40:45

+0

任何其他的想法?我沒有「訂單字段」,我不想爲訂單添加一個auto_increment字段 – Koerr 2010-07-20 11:45:10

+1

您必須這樣做,Zenofo。任何select語句的結果順序都是未定義的,除非有一個order-by子句,並且您需要將「正確的」順序存儲在某個地方。 – 2010-07-20 11:55:59

0

會是這樣的工作?

SELECT @rownum := @rownum +1 `rank`, 
     T.* 
    FROM TestTable T, 
     (SELECT @rownum :=0) T 
ORDER BY `rank` DESC 
+0

不能在mysql 4.1 T中工作,T – Koerr 2010-07-20 11:57:44

1

聽起來像您想要使用自定義排序順序進行排序。可以想到兩種方法:1)將排序順序放入表中並在查詢中使用該表; 2)使用分隔字符串(假設域中值的數量很小,穩定,值相似和「窄」的寬度)。

請原諒SQL Server語法,但相當標準,希望你得到的總體思路:

例如1

WITH MyTable (ID, data_col) 
    AS 
    (
     SELECT ID, data_col 
     FROM (
       VALUES (1, 'aa'), 
        (2, '111'), 
        (3, 'ccc'), 
        (4, 'bbb'), 
        (5, '111'), 
        (6, 'aa'), 
        (7, '111'), 
        (8, 'bbb') 
      ) AS MyTable (ID, data_col) 
    ), 
    MyDomainWithSortOrder (domain_col, sort_seq) 
    AS 
    (
     SELECT ID, domain_col 
     FROM (
       VALUES ('bbb', 1), 
        ('111', 2), 
        ('aa', 3), 
        ('ccc', 4) 
      ) AS MyDomainWithSortOrder (ID, domain_col) 
    ) 
SELECT T1.ID, T1.data_col, D1.sort_seq 
    FROM MyTable AS T1 
     INNER JOIN MyDomainWithSortOrder AS D1 
      ON T1.data_col = D1.domain_col 
ORDER 
    BY sort_seq; 

例如, 2

WITH MyTable (ID, data_col) 
    AS 
    (
     SELECT ID, data_col 
     FROM (
       VALUES (1, 'aa'), 
        (2, '111'), 
        (3, 'ccc'), 
        (4, 'bbb'), 
        (5, '111'), 
        (6, 'aa'), 
        (7, '111'), 
        (8, 'bbb') 
      ) AS MyTable (ID, data_col) 
    ) 
SELECT ID, data_col 
    FROM MyTable 
ORDER 
    BY CHARINDEX(CAST(data_col + ' ' AS CHAR(3)), 'bbb111aa ccc'); 
+0

哦,天啊,謝謝。 – Koerr 2010-07-21 01:17:09