假设我有一个要在给定日期播放的演示文稿列表,遵循以下数据结构:
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
表已被排除在查询之外。
关于MySQL 自定义排序(日期时间和连接表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32070019/