MySQL 自定义排序(日期时间和连接表)

标签 mysql datetime

假设我有一个要在给定日期播放的演示文稿列表,遵循以下数据结构:

ID      DateTime             Title          StreamID
--------------------------------------------------------
2268    2015-07-21 07:45:00  Introduction   NULL
2229    2015-07-21 09:00:00  A              1   
2259    2015-07-21 09:00:00  D              2
2262    2015-07-21 09:00:00  G              3   
2230    2015-07-21 10:00:00  B              1   
2260    2015-07-21 10:00:00  E              2   
2263    2015-07-21 10:00:00  H              3   
2261    2015-07-21 11:00:00  F              2   
2264    2015-07-21 11:00:00  I              3   
2250    2015-07-21 11:00:00  C              1   
2267    2015-07-21 18:00:00  Outro          NULL

有些演示文稿是流的一部分,有些则不是。流是一种以并行方式对演示文稿进行分组的方式 (StreamID 作为我查询的一部分加入)

我希望能够按以下方式对它们进行排序:按日期时间,但如果它们是流的一部分,则按日期时间对演示文稿进行排序,但也首先按流 ID 就像下面这样:

ID      DateTime             Title          StreamID
--------------------------------------------------------
2268    2015-07-21 07:45:00  Introduction   NULL
2229    2015-07-21 09:00:00  A              1   
2230    2015-07-21 10:00:00  B              1
2250    2015-07-21 11:00:00  C              1   
2259    2015-07-21 09:00:00  D              2
2260    2015-07-21 10:00:00  E              2   
2261    2015-07-21 11:00:00  F              2   
2262    2015-07-21 09:00:00  G              3   
2263    2015-07-21 10:00:00  H              3   
2264    2015-07-21 11:00:00  I              3   
2267    2015-07-21 18:00:00  Outro          NULL

希望这是有道理的。

我尝试了以下查询但没有成功:

SELECT * FROM presentation
LEFT JOIN stream ON stream.ID = presentation.StreamID
ORDER BY DateTime, StreamID

SELECT * FROM presentation
LEFT JOIN stream ON stream.ID = presentation.StreamID
ORDER BY StreamID, DateTime

感谢您的回复

最佳答案

您可以使用以下查询:

SELECT p.*
FROM presentation AS p 
INNER JOIN (SELECT COALESCE(StreamID, ID) AS ID, MIN(`DateTime`) AS minDate
            FROM presentation
            GROUP BY COALESCE(StreamID, ID))
AS t ON COALESCE(p.StreamID, p.ID) = t.ID
ORDER BY minDate, p.StreamID, p.DateTime

上述查询使用了一个派生表,该表按 StreamID 对记录进行分组,或者,在 NULL 的情况下,按 ID 对记录进行分组。为每个组选择最小的 DateTime。将这个派生表连接回原始表,我们可以实现组排序,即按日期对每个组进行排序,其中 NULL 值为 StreamID< 的行 被视为一个单独的组。

注意:为了简单起见,Stream 表已被排除在查询之外。

Demo here

关于MySQL 自定义排序(日期时间和连接表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32070019/

相关文章:

c# - 从时区日期时间转换为短日期 C#

python - 日期时间格式混合并分开为两列并更改日期格式

Vb.net 从字符串转换日期时间

mysql - 在 ColdFusion 9 中将 HTML 格式的文本转换为常规文本

php - SQL 查询给出了错误的顺序

java - Servlet 在 Eclipse 中运行时抛出异常

java - 未找到 JDBC 驱动程序,即使我已将其添加到类路径中

regex - 如何在 Perl 中将正则表达式模式定义为常量?

sql-server - 首先使用实体​​框架数据库强制 DateTime

java - 在 PostgreSQL 中加入两个查询