max函数中的SQL比较

时间:2016-03-11 18:35:55

标签: mysql sql

我正在尝试获取按其ID分组的20个事件列表,并根据它们是否正在进行,待处理或已完成进行排序。问题是存在具有相同id的事件,包括已完成,待处理和正在进行的事件,并且我希望最终有20个不同的ID。我想要做的是将这些事件组合在一起,但如果其中一个正在进行中,则按该事件对该组进行排序。所以基本上我想按照现在()之前的最新结束时间排序。

到目前为止我所拥有的是结束和开始是结束/开始时间的事情。我不确定max()内部的内容是否符合我的期望。

center().x

这会导致一些正在运行/待处理的事件在我希望它们按顺序运行时按顺序混合 - >待定 - >结束。

1 个答案:

答案 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 的列之外还返回一个额外的列,它代表该类别的优先级(正在运行,待定,过去):

  1. 正在运行(正在进行中)
  2. 待定(未来)
  3. 过去
  4. 然后以下将做你想做的事:

    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更容易理解,至少对我而言。