SQL - 同一字段的不同“ORDER BY”值

时间:2012-12-15 03:41:07

标签: mysql sql

以下代码生成一个列表,其顶部是非过期行,然后是未知到期日期的列表,最后是已过期的列表(所有这些行都按升序排列)。问题是我希望已经过期的行的最后一个块按降序排列,这样它就会显示最近在该块顶部过期的行,而不会改变其他顶部块的顺序。

基本上,我试图找到一种方法在同一记录集中包含两个“ORDER BY”子句......

有什么想法吗?感谢

SELECT *
  FROM prueba 
 WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s) 
ORDER BY (CASE 
            WHEN prueba.Expiry = 'UNKNOWN' THEN 1 
            WHEN prueba.Expiry < CURRENT_DATE THEN 2 
          END)
       , prueba.Expiry ASC

2 个答案:

答案 0 :(得分:1)

试试这个

DEMO FIDDLE

SELECT * FROM t
order by case 
      when expiry = 'Unknown' Then 1 
      WHEN expiry >= CURRENT_DATE THEN 0 
      ELSE 2 END,
CASE WHEN expiry >= CURRENT_DATE THEN expiry END,
CASE WHEN expiry < CURRENT_DATE THEN expiry END desc

答案 1 :(得分:0)

将已过期的记录分隔为另一个SELECT子句,然后UNION ALL

(SELECT *
FROM prueba
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s)
AND prueba.Expiry > CURRENT_DATE
ORDER BY prueba.Expiry DESC)
UNION ALL
(SELECT *
FROM prueba
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s)
AND prueba.Expiry = 'UNKNOWN')
UNION ALL
(SELECT *
FROM prueba
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s)
AND prueba.Expiry < CURRENT_DATE
ORDER BY prueba.Expiry DESC)