我有一张活动表。主机可以在一天内创建多个事件。有些事件是反复发生的,有些则不是。我有一个复杂的(对我来说)SELECT语句,我认为它需要一些条件,比如how,也许还有一个子查询,我不知道如何处理它。
选择优先级:
如果主机在同一日期有多个事件,并且
其中一个日期不是定期(0),则仅选择该主机在该日期的非定期事件。
如果一个主机在同一日期有多个事件,并且该日期的所有事件都重复发生,则选择该主机在该日期的所有事件。
如果主机在给定日期只有一个事件,请选择它,而不管它是否重复发生。
下面是一个示例事件表:

+----+--------+---------+------------+-----------+
| id | hostid |  title  | start_date | recurring |
+----+--------+---------+------------+-----------+
|  1 |      1 | Event1A | 2016-10-01 |         1 |
|  2 |      1 | Event1B | 2016-10-01 |         0 |
|  3 |      1 | Event1C | 2016-10-02 |         0 |
|  4 |      1 | Event1D | 2016-10-02 |         1 |
|  5 |      1 | Event1E | 2016-10-02 |         1 |
|  6 |      1 | Event1F | 2016-10-03 |         1 |
|  7 |      1 | Event1G | 2016-10-03 |         1 |
|  8 |      1 | Event1H | 2016-10-04 |         1 |
|  9 |      1 | Event1I | 2016-10-05 |         0 |
| 10 |      2 | Event2A | 2016-10-01 |         1 |
| 11 |      2 | Event2B | 2016-10-01 |         0 |
| 12 |      2 | Event2C | 2016-10-02 |         1 |
| 13 |      2 | Event2D | 2016-10-03 |         0 |
+----+--------+---------+------------+-----------+

以下是我想要的结果:
+----+--------+---------+------------+-----------+
| id | hostid |  title  | start_date | recurring |
+----+--------+---------+------------+-----------+
|  2 |      1 | Event1B | 2016-10-01 |         0 |
|  3 |      1 | Event1C | 2016-10-02 |         0 |
|  6 |      1 | Event1F | 2016-10-03 |         1 |
|  7 |      1 | Event1G | 2016-10-03 |         1 |
|  8 |      1 | Event1H | 2016-10-04 |         1 |
|  9 |      1 | Event1I | 2016-10-05 |         0 |
| 11 |      2 | Event2B | 2016-10-01 |         0 |
| 12 |      2 | Event2C | 2016-10-02 |         1 |
| 13 |      2 | Event2D | 2016-10-03 |         0 |
+----+--------+---------+------------+-----------+

下面是一个与表有关的SQL Fiddle链接:
http://sqlfiddle.com/#!9/6427e/6

最佳答案

任务相当简单:您需要每个主机和日期具有最小重复标志的记录。

select events.*
from
(
  select hostid, start_date, min(recurring) as recurring
  from events
  group by hostid, start_date
) chosen
join events on events.hostid = chosen.hostid
            and events.start_date = chosen.start_date
            and events.recurring = chosen.recurring
order by events.id;

这是你的SQL键盘:http://sqlfiddle.com/#!9/6427e/59:-)

关于mysql - MySQL在按条件按多个列分组时选择行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39694564/

10-11 22:35
查看更多