如何通过插入序列DESC来订购数据?

时间:2010-07-20 11:36:18

标签: sql mysql

我有一个表:TestTable,这个表只有一个字段:value,我插入相同的数据:

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

告诉你!

3 个答案:

答案 0 :(得分:4)

没有可以在订单声明中使用的自动“创建订单”标识符。您应该使用auto_increment列来记录您的记录。然后,您可以按该列进行排序。

MySQL docs on auto_increment

答案 1 :(得分:1)

听起来像是要使用自定义排序顺序排序。我想到了两种方法:1)将排序顺序放在表中并在查询中使用该表; 2)使用分隔的字符串(假设域中的值的数量很小,稳定且值相似且“窄”宽度)。

请原谅SQL Server语法但相当标准,希望你能得到一般的想法:

e.g。 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;

e.g。 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');

答案 2 :(得分:0)

这样的事情会起作用吗?

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