MySQL基于标准的重叠时间段
我正在尝试编写一个查询,该查询将根据Valid\u From和Valid\u to以及基于条件的值显示所有重叠的记录 这是我的示例数据:MySQL基于标准的重叠时间段,mysql,Mysql,我正在尝试编写一个查询,该查询将根据Valid\u From和Valid\u to以及基于条件的值显示所有重叠的记录 这是我的示例数据: ID | Valid_From | Valid_To | Block_Type | Valid | Block_ID 1 5 10 a TRUE 1 2 10 15 a
ID | Valid_From | Valid_To | Block_Type | Valid | Block_ID
1 5 10 a TRUE 1
2 10 15 a TRUE 1
3 6 10 a TRUE 1
4 3 4 a FALSE 1
5 2 4 a FALSE 1
6 1 1 a FALSE 1
7 1 10 b TRUE 1
8 1 10 c TRUE 2
9 1 10 c TRUE 2
10 1 15 b TRUE 1
11 5 10 a TRUE 1
- ID是自动递增的主键-对于每个记录都是唯一的
- 块类型-块类型-每个块ID可以有更多的值示例:块ID 1有块类型“a”和“b”,块ID 2有块类型“c”,每个块ID可以有任何块类型,这意味着每个块ID可以有块类型“a”到“z”
- Valid-这只是说明Valid_To是否大于某个值,例如 测试时,我将该值设置为5 Block_ID-将多个记录分组到一个组中
select a.id, GROUP_CONCAT(b.id) as abcd
from new_table a, new_table b
where a.id <> b.id
and a.Block_ID = b.Block_ID
and a.Block_Type = b.Block_Type
and a.Valid = b.Valid
and ((a.Valid_To between b.Valid_From and b.Valid_To) or (a.Valid_From between b.Valid_From and b.Valid_To)
or (a.Valid_To = b.Valid_From) or (a.Valid_From = b.Valid_To))
group by a.id;
我希望此查询列出所有记录,并在新列“abcd”中列出所有重叠的记录,对于不重叠的记录,我只希望在同一列中为null,因此它将如下所示:
ID | abcd
1 2
2 1,11,3
3 2
4 5
5 4
6 null
7 10
8 9
9 8
10 7
11 2
你能给我指出正确的方向吗?我能做些什么来让它按我需要的方式工作
非常感谢如果我正确理解了您的问题,您需要左连接而不是内部连接-
SELECT a.id, GROUP_CONCAT(b.id) AS abcd
FROM new_table a
LEFT JOIN new_table b ON a.id <> b.id
AND a.Block_ID = b.Block_ID
AND a.Block_Type = b.Block_Type
AND a.Valid = b.Valid
AND ((a.Valid_To BETWEEN b.Valid_From AND b.Valid_To)
OR (a.Valid_From BETWEEN b.Valid_From AND b.Valid_To)
OR (a.Valid_To = b.Valid_From)
OR (a.Valid_From = b.Valid_To)
)
GROUP BY a.id;
选择a.id、组(b.id)作为abcd
来自新表a
左连接a.id b.id上的新表b
a.Block\u ID=b.Block\u ID
a.Block_Type=b.Block_Type
a.Valid=b.Valid
和((a.Valid_To介于b.Valid_From和b.Valid_To之间)
或者(a.Valid\u From介于b.Valid\u From和b.Valid\u To之间)
或(a.Valid\u To=b.Valid\u From)
或(a.Valid\u From=b.Valid\u To)
)
a.id分组;
如果我正确理解了您的问题,您需要左连接而不是内连接-
SELECT a.id, GROUP_CONCAT(b.id) AS abcd
FROM new_table a
LEFT JOIN new_table b ON a.id <> b.id
AND a.Block_ID = b.Block_ID
AND a.Block_Type = b.Block_Type
AND a.Valid = b.Valid
AND ((a.Valid_To BETWEEN b.Valid_From AND b.Valid_To)
OR (a.Valid_From BETWEEN b.Valid_From AND b.Valid_To)
OR (a.Valid_To = b.Valid_From)
OR (a.Valid_From = b.Valid_To)
)
GROUP BY a.id;
选择a.id、组(b.id)作为abcd
来自新表a
左连接a.id b.id上的新表b
a.Block\u ID=b.Block\u ID
a.Block_Type=b.Block_Type
a.Valid=b.Valid
和((a.Valid_To介于b.Valid_From和b.Valid_To之间)
或者(a.Valid\u From介于b.Valid\u From和b.Valid\u To之间)
或(a.Valid\u To=b.Valid\u From)
或(a.Valid\u From=b.Valid\u To)
)
a.id分组;
Hello Ankit,非常感谢您的评论,您的代码不幸返回相同的结果:(,出于某种原因,我仍然没有看到ID为6的记录。@Raymond_90,您现在可以试一试吗?您很好:)只需更改到何处,它就可以工作:)非常感谢,我接受你的答案作为解决办法很高兴听到它对你有用。欢迎光临。这里的查询似乎比严格要求的要多。您好,Ankit,非常感谢您的评论,您的代码不幸返回了相同的结果:(,出于某种原因,我仍然没有看到ID为6的记录。@Raymond_90,您现在可以试一试吗?您很棒:)只需改变地址,它就行了:)非常感谢,我接受你的答案作为解决方案。很高兴听到它对你有用。欢迎光临。这里似乎有更多的疑问,而不是严格必要的。?结果集与数据集不匹配!?嗨,草莓,对不起,你什么意思?如果您在我的代码中发现任何错误,我将非常高兴,因此我可以进行更多练习:)您的查询不会返回该结果集。啊哈,对我来说确实如此,如果我们讨论第三个代码块,我无法复制此结果。如果你对现有的答案感到满意(我觉得这是不必要的冗长),那就好了。否则,看到了吗?结果集与数据集不匹配!?嗨,草莓,对不起,你什么意思?如果您在我的代码中发现任何错误,我将非常高兴,因此我可以进行更多练习:)您的查询不会返回该结果集。啊哈,对我来说确实如此,如果我们讨论第三个代码块,我无法复制此结果。如果你对现有的答案感到满意(我觉得这是不必要的冗长),那就好了。否则,请参见