我有两张不同类型的新闻。我想创建一个按日期排序的列表,这个日期取决于新闻的类型,所以我尝试了这个:
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
但它不起作用。有可能这样做吗?
谢谢。
答案 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