Сложность с запросом диапазона внутреннего соединения MySQL - PullRequest
1 голос
/ 27 ноября 2011

Я действительно борюсь с запросом MySQL, с которым я действительно надеюсь, что кто-то может помочь мне. У меня есть три таблицы в базе данных MySQL - таблица A, B и C. Я хотел бы найти все значения из таблицы A, столбец 1 (a.1), которые соответствуют значению в таблице B, столбец 2 (b.2). Затем для каждого совпадения b.2 найдите все другие значения b.2 в таблице B, которые находятся в диапазоне +/- 100 от целочисленного значения, найденного в b.3, в строках, где a.1 соответствует b.2. Затем, наконец, мне нужно взять эти значения b.2 и найти совпадающие значения b.2 в столбце 4 таблицы C.

Вот как я пытался выполнить запрос:

SELECT * 
FROM TableB AS b 
INNER JOIN TableA AS a ON b.2 = a.1 
AND b.3 >= (b.3 - 100) 
AND b.3 <= (b.3 + 100) 
INNER JOIN TableC as c 
ON b.2 = c.4;

Я пытался проиллюстрировать, что я пытаюсь сделать с картинкой, надеюсь, это поможет. enter image description here

Ответы [ 2 ]

2 голосов
/ 27 ноября 2011

Из вашего описания я искал этот запрос:

SELECT a.one, b.three, c.four
FROM   a
JOIN   b AS b0 ON b0.two = a.one             -- intermediary step
JOIN   b ON b.three BETWEEN b0.three - 100 
                        AND b0.three + 100   -- real b values
JOIN   c ON c.four = b.two

Проблемы, которые я вижу в вашем запросе:

  • У вас есть WHERE a.1 = b.2, где он должен быть ON a.1 = b.2
  • В финальном СОЕДИНЕНИИ у вас есть ON bb.3 = c.4, в то время как согласно вашему описанию оно должно быть ВКЛ bb.2 = c.4.
  • Если ваше описание неверно и ваша демонстрацияверно , тогда мы можем упростить до:

SELECT a.one, b.three, c.four
FROM   a
JOIN   b ON b.two = a.one
JOIN   c ON c.four BETWEEN b.three - 100 AND b.three + 100
1 голос
/ 27 ноября 2011

Прежде чем ответить, нам нужно знать, что происходит. Это работает? Что это производит? Есть ли ошибка?

В любом случае, вот мое предположение (также я предполагаю, что вы не используете имена столбцов, такие как 1 или 2 или 3, и это только для демонстрационных целей):

SELECT *
FROM TableB AS b
  INNER JOIN TableA AS a
    ON a.1 = b.2
  INNER JOIN TableB as bb
    ON bb.3 between (b.3 - 100) AND (b.3 + 100)
  INNER JOIN TableC as c
    ON bb.3 = c.4

Единственное изменение касается условия соединения для таблицы А. Ваша ошибка должна была быть синтаксической. И я упростил условие между.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...