Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL基于标准的重叠时间段_Mysql - Fatal编程技术网

MySQL基于标准的重叠时间段

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

我正在尝试编写一个查询,该查询将根据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              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,您现在可以试一试吗?您很棒:)只需改变地址,它就行了:)非常感谢,我接受你的答案作为解决方案。很高兴听到它对你有用。欢迎光临。这里似乎有更多的疑问,而不是严格必要的。?结果集与数据集不匹配!?嗨,草莓,对不起,你什么意思?如果您在我的代码中发现任何错误,我将非常高兴,因此我可以进行更多练习:)您的查询不会返回该结果集。啊哈,对我来说确实如此,如果我们讨论第三个代码块,我无法复制此结果。如果你对现有的答案感到满意(我觉得这是不必要的冗长),那就好了。否则,看到了吗?结果集与数据集不匹配!?嗨,草莓,对不起,你什么意思?如果您在我的代码中发现任何错误,我将非常高兴,因此我可以进行更多练习:)您的查询不会返回该结果集。啊哈,对我来说确实如此,如果我们讨论第三个代码块,我无法复制此结果。如果你对现有的答案感到满意(我觉得这是不必要的冗长),那就好了。否则,请参见