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

时间:2015-08-18 10:35:49

标签: 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为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

感谢您的回复

1 个答案:

答案 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表已被排除在查询之外。

Demo here