【发布时间】:2011-10-04 03:33:19
【问题描述】:
我有一个包含 start_date 和 end_date 列的表。我们需要做的是选择所有内容并按每个 Object_ID 的日期冲突对它们进行分组。
日期冲突是指一行的开始日期和/或结束日期经过另一行。例如,以下是一些冲突示例:
第 1 行的日期为第 1 到第 5,第 2 行的日期为第 2 到第 3。
第 1 行的日期为第 2 到第 5,第 2 行的日期为第 1 到第 3。
第 1 行的日期为第 2 到第 5,第 2 行的日期为第 3 到第 6。
第 1 行包含第 2 到第 5 个日期,第 2 行包含第 1 到第 7 个日期。
例如,如果我们有一些示例数据(为简单起见,假设这些数字只是一个月中的几天):
id | object_id | start_date | end_date
1 | 1 | 1 | 5
2 | 1 | 2 | 4
3 | 1 | 6 | 8
4 | 2 | 2 | 3
我希望看到的是:
object_id | start_date | end_date | numconflicts
1 | <na> | <na> | 2
1 | 6 | 8 | 0 or null
2 | 2 | 3 | 0 or null
对于第二个测试用例,以下是一些示例数据:
id | object_id | start_date | end_date
1 | 1 | 1 | 5
2 | 1 | 2 | 4
3 | 1 | 6 | 8
4 | 2 | 2 | 3
5 | 2 | 4 | 5
6 | 1 | 2 | 3
7 | 1 | 10 | 12
8 | 1 | 11 | 13
对于第二个测试用例,我期望看到的输出:
object_id | start_date | end_date | numconflicts
1 | <na> | <na> | 3
1 | 6 | 8 | 0 or null
2 | 2 | 3 | 0 or null
2 | 4 | 5 | 0 or null
1 | <na> | <na> | 2
是的,我需要一些方法来区分第一组和第二组(第一行和最后一行),但我还没有完全弄清楚。目标是查看此列表,然后当您单击一组冲突时,您可以查看该组中的所有冲突。
我的第一个想法是尝试一些 GROUP BY CASE ... 子句,但我只是把头缠在自己身上。
我用来调用mysql的语言是php。因此,如果有人知道 php-loop 解决方案而不是大型 mysql 查询,我会全神贯注。
提前致谢。
编辑:在主键中添加以减少混乱。
编辑:在测试用例 2 中添加以提供更多推理。
【问题讨论】:
-
不,object_id 不引用表的 id,它只是将对象引用到具有该 id 的不同表。这意味着,只有具有相似 object_id 的行才有可能发生冲突。
-
只是想一想:如果您打算将冲突行设为可点击和可展开的,那么使用
<na>而不是实际日期似乎没有多大意义。如果我是你,我可能会使用MIN(start_date) AS start_date和MAX(end_date) AS end_date作为冲突行。这样用户就可以立即看到冲突组所属的日期范围,而无需先单击/展开它。