在MySQL中的条件排序中混合升序和降序排序

时间:2009-10-13 14:04:25

标签: mysql sorting

我有两张不同类型的新闻。我想创建一个按日期排序的列表,这个日期取决于新闻的类型,所以我尝试了这个:

SELECT * FROM my_table
ORDER BY case type
              when 'news' then creation_date 
              else 'events' then starting_date
         end desc;

我想要的是按creation_date ASC排序新闻和starting_date DESC排序的事件。我试着简单地添加

when 'news' then creation_date ASC
else 'events' then starting_date DESC

但它不起作用。有可能这样做吗?

谢谢。

6 个答案:

答案 0 :(得分:2)

我认为你需要做两个单独的查询,每个查询按自己的方式排序。要进行排序,它需要能够将任何项目与任何其他项目进行比较,并确定哪个项目是第一项。它无法将“新闻”项目与“事件”项目进行比较,并获得有意义的结果。

答案 1 :(得分:1)

我找到了解决方案:

SELECT 
    UNIX_TIMESTAMP(creation_date) AS order_column,
    creation_date,
    type,
    other_columns
FROM my_table 
WHERE type='news'
UNION ALL
SELECT 
    -UNIX_TIMESTAMP(starting_date) AS order_column,
    starting_date, 
    type,
    other_columns
FROM my_table 
WHERE type='events' 
ORDER BY order_column

重要的是在第二个UNIX_TIMESTAMP函数之前的减号。它将导致事件按降序排序,然后所有新闻按升序排序。我希望这就是你想要的。

答案 2 :(得分:0)

会像这样的工作吗?

select m.*, 
       case type
          when 'news' then 
             creation_date 
          when 'events' then 
             starting_date
       end as sort_date
from my_table m
order by sort_date desc

答案 3 :(得分:0)

select m.*, 
       case type
          when 'news' then 
             creation_date 
       end as sort_date_1,
       case type
          when 'events' then 
             starting_date
       end as sort_date_2
from my_table m
order by type desc, sort_date_1 asc nulls last, sort_date_2 desc nulls last

答案 4 :(得分:0)

select ...  
    row_number() over (order by
        case when type = 'news'  then creation_date end asc,
        case when type = 'event' then starting_date end desc) as rn
...
order by rn, type desc,
    case when type = 'news' then creation_date else starting_date end asc

答案 5 :(得分:0)

order by type,
    case when type = 'news'  then creation_date end desc,
    case when type = 'event' then starting_date end asc