我正在尝试获取按其ID分组的20个事件列表,并根据它们是否正在进行,待处理或已完成进行排序。问题是存在具有相同id的事件,包括已完成,待处理和正在进行的事件,并且我希望最终有20个不同的ID。我想要做的是将这些事件组合在一起,但如果其中一个正在进行中,则按该事件对该组进行排序。所以基本上我想按照现在()之前的最新结束时间排序。
到目前为止我所拥有的是结束和开始是结束/开始时间的事情。我不确定max()内部的内容是否符合我的期望。
center().x
这会导致一些正在运行/待处理的事件在我希望它们按顺序运行时按顺序混合 - >待定 - >结束。
答案 0 :(得分:0)
我建议先创建一个视图,以免得到过于复杂的SELECT
语句:
CREATE VIEW v_event_schedule AS
SELECT *,
CASE
WHEN end < unix_timestamp(now())
THEN 1
WHEN start > unix_timestamp(now())
THEN 2
ELSE 3
END AS category
FROM event_schedule;
此视图 v_event_schedule 除了 event_schedule 的列之外还返回一个额外的列,它代表该类别的优先级(正在运行,待定,过去):
然后以下将做你想做的事:
SELECT a.*
FROM v_event_schedule a
INNER JOIN (
SELECT id,
MIN(category) category
FROM v_event_schedule b
GROUP BY id
) b
ON a.id = b.id
AND a.category = b.category
ORDER BY category,
start DESC
LIMIT 20;
ORDER BY
可以进一步根据您对同一类别中的排序方式的需求进行调整。我添加start DESC
,因为这似乎是你在尝试中所做的。
ORDER BY
你有这个:
order by MAX(end < unix_timestamp(now())) asc,
MIN(start >= unix_timestamp(now())) asc,
你在那里的表达式评估为布尔值,ORDER BY
中的两个元素都将组分成两部分,一部分用于false
,一部分用于true
,所以总共4组。
这两个中的第一个将首先命令ID,这些ID在过去没有带 end 值的记录,因为只有这样布尔表达式总是false
这是唯一的方法同时制作MAX
false
。
现在让我们说同一个ID,您将来有两个记录 end 日期以及 end 日期的记录过去。在这种情况下,MAX
汇总到true
,因此 id 将被排序为辅助。这不是预期的,因为此ID可能具有&#34;运行&#34;记录。
我没有考虑根据布尔表达式上的这种聚合来使查询工作。需要一些时间来了解他们正在做什么。使用数字确定类别的CASE WHEN
确实使SQL更容易理解,至少对我而言。