范围重叠 - 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
确实是每一行的唯一标识符。
请注意,count
和 end
是列名称的不佳选择,因为它们是 SQL 个关键字。
Here 是一个 db<>fiddle.
有谁知道如何使用 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
确实是每一行的唯一标识符。
请注意,count
和 end
是列名称的不佳选择,因为它们是 SQL 个关键字。
Here 是一个 db<>fiddle.