我目前正在制作一个包含演出议程的艺术家网站。我希望它能够在开始时列出第一个即将到来的演出(asc),并在即将到来的演出之后列出过去的演出。我目前的解决方案是两个不同的查询,一个调用即将发生的事件和一个过去的事件,但我认为找出合并它们的方法更为简洁。有人知道这是否可能,以及如何?
这就是我的开始;
SELECT *
FROM agenda
INNER JOIN organizer ON agenda.agenda_organizer=organizer.organizer_id
答案 0 :(得分:5)
SELECT *
FROM agenda
INNER JOIN organizer ON agenda.agenda_organizer=organizer.organizer_id
ORDER BY
CASE WHEN yourDateColumn > NOW() THEN 1
WHEN yourDateColumn < NOW() THEN 2
END ASC,
yourDateColumn
答案 1 :(得分:0)
如果您使用UNION,那么您可以整齐地执行这两个语句 - 并且因为每个ORDER BY只是在日期字段上,您知道它会使用index来保留你的查询速度快:
SELECT *
FROM agenda
INNER JOIN organizer ON agenda.agenda_organizer=organizer.organizer_id
WHERE yourDateColumn > NOW()
ORDER BY yourDateColumn ASC
UNION ALL
SELECT *
FROM agenda
INNER JOIN organizer ON agenda.agenda_organizer=organizer.organizer_id
WHERE yourDateColumn < NOW()
ORDER BY yourDateColumn DESC
答案 2 :(得分:0)
你可以试试这个:
SELECT *
FROM
(SELECT * FROM agenda WHERE yourDateColumn > NOW() ORDER BY yourDateColumn ASC) future
UNION ALL
SELECT *
FROM
(SELECT * FROM agenda WHERE yourDateColumn < NOW() ORDER BY yourDateColumn DESC) past
这应该选择第一个即将发生的事件ASC,然后选择过去的事件DESC
答案 3 :(得分:0)
可以通过以下方法在两个方向上订购相同的列:
SELECT yourDateColumn,IF(yourDateColumn)<NOW(),DATEDIFF(yourDateColumn),NOW()) * -1000000000,UNIX_TIMESTAMP(STR_TO_DATE(CONVERT_TZ(e.startDate,e.timeZone,'Europe/Paris'), '%Y-%m-%d'))) AS diff FROM yourTable ORDER BY DIFF ASC;
这里的关键是乘以足够大的负数,所以日期最终由即将到来的ASC排序,然后经过DESC。