Как выполнить сложный запрос диапазона в MySQL - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть таблица (Таблица A) с полем целых чисел (Поле B).Для каждой строки таблицы A я хотел бы построить диапазон +/- 100, окружающий целочисленное значение поля B, а затем найти все значения из поля B, которые находятся в этих диапазонах.Запрос должен быть выполнен для всех значений в поле B. Запрос должен возвращать каждую строку, которая находится в каждом диапазоне строк.Вот пример того, что я пытаюсь сделать:

Table A
_______
A    1000    
B    3000    
C    5000    
D    1090   

Используя приведенную выше таблицу A, запрос сначала найдет диапазоны (+/- 100) для всех целых чисел в поле B.

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

Затем запрос будет проходить через эти диапазоны и возвращать строки из таблицы A, которые попадают в сгенерированные диапазоны.Используя приведенный выше пример, запрос будет возвращать:

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

A и D возвращаются дважды, поскольку они попадают в их собственные диапазоны.Как создать запрос, который будет возвращать каждую строку, попадающую в диапазон каждой строки?Заранее спасибо за помощь.

Ответы [ 2 ]

5 голосов
/ 21 ноября 2011
SELECT t2.*
FROM tableA AS t1
INNER JOIN tableA AS t2 ON t2.fieldB >= (t1.fieldB - 100) AND t2.fieldB <= (t1.fieldB + 100)

Разве А не должен отображаться дважды, поскольку он также находится в диапазоне D? (это относится к приведенному выше запросу - если неверно, уточните почему ^^)

1 голос
/ 21 ноября 2011

Начните с самого внутреннего предварительного квалификатора каждой записи таблицы А ... Затем снова присоединитесь к таблице А.Я добавил низкие диапазоны квалификационных групп и привет, чтобы показать базу квалификаторов, которую вы искали ... В дополнение к тому, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...