ASC的SQL查询订单日期,但过去的条目结束了吗?

时间:2013-04-26 12:40:54

标签: mysql sql

我目前正在制作一个包含演出议程的艺术家网站。我希望它能够在开始时列出第一个即将到来的演出(asc),并在即将到来的演出之后列出过去的演出。我目前的解决方案是两个不同的查询,一个调用即将发生的事件和一个过去的事件,但我认为找出合并它们的方法更为简洁。有人知道这是否可能,以及如何?

这就是我的开始;

SELECT * 
FROM agenda 
INNER JOIN organizer ON agenda.agenda_organizer=organizer.organizer_id

4 个答案:

答案 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。