【问题标题】:Ranges overlap - MySQL范围重叠 - MySQL
【发布时间】:2021-03-24 11:03:54
【问题描述】:

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

谢谢!

范围

| 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                    |  

【问题讨论】:

    标签: mysql sql fetch range overlap


    【解决方案1】:

    一种方法是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 行的表上,这不会很快,但应该是可行的。您可能希望在较小的表上验证逻辑。

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

    请注意,countend 是列名的糟糕选择,因为它们是 SQL 关键字。

    Here 是一个 dbfiddle。

    【讨论】:

    • 奇怪的是,COUNT 实际上并不被视为关键字(而且 COUNT 和 END 都不是'保留'),但我同意这个原则。
    • 感谢您的帮助!按照小提琴尝试过,但我相信由于我的版本可能有点旧(mysql 5.7)而存在冲突 - 我不断收到“语句违反 GTID 一致性:CREATE TABLE ... SELECT”;不知道如何从这里开始,因为我是 SQL 的新手
    • @WilliamBracamonteBaran。 . .这也适用于旧版本:dbfiddle.uk/….
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多