我们假设我有一个演示文稿列表,这些演示文稿要在特定日期播放,遵循以下数据结构:
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为FIRST 如下所示:
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
AND
SELECT * FROM presentation
LEFT JOIN stream ON stream.ID = presentation.StreamID
ORDER BY StreamID, DateTime
感谢您的回复
答案 0 :(得分:1)
您可以使用以下查询:
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
表已被排除在查询之外。