【问题标题】:How to perform a complex range query in MySQL如何在 MySQL 中执行复杂的范围查询
【发布时间】:2011-11-21 22:45:15
【问题描述】:

我有一个包含整数字段(字段 B)的表(表 A)。对于表 A 的每一行,我想围绕字段 B 的整数值构建一个 +/- 100 的范围,然后从字段 B 中找到这些范围内的所有值。需要对字段 B 中的所有值执行查询。查询需要返回每个行范围内的每一行。这是我正在尝试做的一个示例:

Table A
_______
A    1000    
B    3000    
C    5000    
D    1090   

使用上面的表 A,查询将首先找到字段 B 中所有整数的范围 (+/- 100)。

900 - 1100
2900 - 3100
4900 - 5100
990 - 1190

然后,查询将遍历这些范围,并从表 A 返回位于生成范围内的行。使用上面的示例,查询将返回:

A    1000
A    1000
B    3000
C    5000
D    1090
D    1090

AD 被返回两次,因为它们属于它们自己的范围。如何构造一个查询,该查询将返回位于每行范围之间的每一行?提前感谢您的帮助。

【问题讨论】:

    标签: mysql sql range


    【解决方案1】:
    SELECT t2.*
    FROM tableA AS t1
    INNER JOIN tableA AS t2 ON t2.fieldB >= (t1.fieldB - 100) AND t2.fieldB <= (t1.fieldB + 100)
    

    A 是否也应该显示两次,因为它也在 D 的范围内? (上面的查询就是这种情况-如果不正确,请详细说明原因^^)

    【讨论】:

    • 那么上面的查询将完全满足您的需求:)
    【解决方案2】:

    从每个表 A 记录的最里面的预限定符开始...然后再次重新加入表 A。我已经添加了限定组范围 low 和 hi 以显示您正在寻找的限定符基础......除了 D 出现两次之外,A 也应该出现两次,因为它也符合“D”的范围。

    select 
          a2.ShowLetter,
          a2.FieldB,
          GrpRanges.RangeLow,
          GrpRanges.RangeHi
       from 
          ( select distinct 
                  a1.FieldB - 100 as RangeLow,
                  a1.FieldB + 100 as RangeHi
               from
                  TableA a1 ) GrpRanges
    
          JOIN TableA a2
             on a2.FieldB between GrpRanges.RangeLow and GrpRanges.RangeHi
       order by 
          a2.ShowLetter
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 2014-01-04
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多