范围重叠 - MySQL

Ranges overlap - MySQL

有谁知道如何使用 MySQL 找到重叠的范围?本质上,如下面的 table 所示(只是为了说明问题,因为实际 table 包含 1000 多个范围),我试图获取在 table 内重叠的所有范围。

谢谢!

范围

| count | Begin      | End  |        Comment                |
|  1    | 1001       | 1095 | overlaps with ranges 2, 3     |                            
|  2    | 1005       | 1030 | overlaps with ranges 1, 3     |                
|  3    | 1017       | 1020 | overlaps with ranges 1, 2     |                  
|  4    | 1110       | 1125 | no overlap                    |  

一种方法是 self join 和聚合:

select r1.count, r1.begin, r1.end,
       group_concat(r2.count order by r2.count) as overlaps
from ranges r1 left join
     ranges r2
     on r1.end >= r2.begin and
        r1.begin <= r2.end and
        r1.count <> r2.count
group by r1.count, r1.begin, r1.end;

在具有 1000 行的 table 上,这不会很快,但应该可行。您可能想要在较小的 table.

上验证逻辑

这假设 count 确实是每一行的唯一标识符。

请注意,countend 是列名称的不佳选择,因为它们是 SQL 个关键字。

Here 是一个 db<>fiddle.