Mysql SQL按ASC查询订单日期,但是否结束了过去的条目?

Mysql SQL按ASC查询订单日期,但是否结束了过去的条目?,mysql,sql,Mysql,Sql,我目前正在一个艺术家网站上工作,该网站包含了一个演唱会议程。我想让它在开始的asc上列出第一个即将到来的演唱会,并在即将到来的演唱会之后列出过去的演唱会。我目前的解决方案是两种不同的查询,一种是调用即将发生的事件,另一种是调用过去的事件,但我认为找到一种合并它们的方法更为简洁。有人知道这是否可能,以及如何实现吗 我就是这样开始的 SELECT * FROM agenda INNER JOIN organizer ON agenda.agenda_organizer=organizer.org

我目前正在一个艺术家网站上工作,该网站包含了一个演唱会议程。我想让它在开始的asc上列出第一个即将到来的演唱会,并在即将到来的演唱会之后列出过去的演唱会。我目前的解决方案是两种不同的查询,一种是调用即将发生的事件,另一种是调用过去的事件,但我认为找到一种合并它们的方法更为简洁。有人知道这是否可能,以及如何实现吗

我就是这样开始的

SELECT * 
FROM agenda 
INNER JOIN organizer ON agenda.agenda_organizer=organizer.organizer_id
如果使用a,则可以整齐地执行这两条语句,因为每条语句都位于日期字段上,因此您知道它将使用来保持查询速度:

    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
如果使用a,则可以整齐地执行这两条语句,因为每条语句都位于日期字段上,因此您知道它将使用来保持查询速度:

    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
您可以尝试以下方法:

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,然后选择过去的事件描述。您可以尝试以下操作:

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,然后选择过去的事件描述。使用技巧可以在两个方向上对同一列进行排序:

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排序,然后按过去的描述排序。

使用以下技巧可以将同一列按两个方向排序:

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排序。

您还应该将您的date列添加到“ORDER by”子句中;否则,你可能只会得到一组无序的即将到来的事件,以及一组无序的过去事件。我很抱歉延迟回答,我有一些健康问题。不过,还是回到了正轨。谢谢你为我指明了正确的方向!!顺便说一句,我假设这也会命令“过去”事件ASC。有没有办法对过去的事件进行排序,以便在过去的事件部分中首先列出最近的过去事件?恐怕不可能在两个不同的方向上对同一列进行排序。这两种情况都不是。。。在这里,自加入和联合都没有帮助,您必须在应用程序层上这样做;否则,你可能只会得到一组无序的即将到来的事件,以及一组无序的过去事件。我很抱歉延迟回答,我有一些健康问题。不过,还是回到了正轨。谢谢你为我指明了正确的方向!!顺便说一句,我假设这也会命令“过去”事件ASC。有没有办法对过去的事件进行排序,以便在过去的事件部分中首先列出最近的过去事件?恐怕不可能在两个不同的方向上对同一列进行排序。这两种情况都不是。。。在这方面,自加入和联合都没有帮助,您必须在应用程序层上这样做。