MySQL conditional ORDER BY ASC/DESC for date column

此生再无相见时 提交于 2019-11-28 03:40:33

问题


I need a MySQL conditional ORDER BY statement for a datetime field. I have a table with posts which I would like to order in the following way: all future posts should be ordered ASC and all historical posts ordered DESC. Eg.:

post_status     post_date     post_title
===========     =========     ==========
future          2012-10-01    Title 1
future          2012-12-01    Title 2
publish         2012-05-01    Title 3
publish         2012-01-01    Title 4

I need something similar to the following SQL...

SELECT post_status, post_date, post_title FROM wp_posts
WHERE post_status IN ('future', 'publish')
ORDER BY post_status ASC,
 CASE post_status 
  WHEN 'future' THEN 'post_date ASC'
  ELSE 'post_date DESC'
 END;

Any hints on how to do this? Thanks!


回答1:


Try this:

ORDER BY post_status ASC,
CASE post_status WHEN 'future' THEN POST_DATE END ASC,
CASE WHEN post_status <> 'future' THEN post_date END DESC



回答2:


How about something like this? Select twice and union the results.

Select * from (SELECT post_status, post_date, post_title 
FROM wp_posts WHERE post_status IN ('future') 
ORDER BY post_status ASC  ) alias1  
UNION
Select * from (SELECT post_status, post_date, post_title 
FROM wp_posts WHERE post_status IN ('publish') 
ORDER BY post_status DESC ) alias2  



回答3:


Try this one -

SELECT
  post_status, post_date, post_title
FROM
  wp_posts
WHERE
  post_status IN ('future', 'publish')
ORDER BY
  IF(post_status = 'future', 0, 1),
  IF(post_status = 'future', TO_DAYS(post_date), TO_DAYS(post_date) * -1);



回答4:


i would use an union all, tricks in order by can't use index and is slower.

SELECT * FROM
((SELECT
  1 AS a, @rownum:=@rownum+1 B, post_status, post_date, post_title
FROM
  wp_posts, (SELECT @rownum:=0) r 
WHERE
  post_status='publish'
ORDER BY
  post_date DESC)
UNION ALL
(SELECT
  2 AS a,  @rownum:=@rownum+1 B, post_status, post_date, post_title
FROM
  wp_posts, (SELECT @rownum:=0) r2
WHERE
  post_status='future'
ORDER BY
  post_date)) ORDER BY A,B;


来源:https://stackoverflow.com/questions/10626363/mysql-conditional-order-by-asc-desc-for-date-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!