我有一张活动表。主机可以在一天内创建多个事件。有些事件是反复发生的,有些则不是。我有一个复杂的(对我来说)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/