Как убрать ненужное объединение, обновить где условия - PullRequest
3 голосов
/ 24 ноября 2011

У меня есть три таблицы в базе данных MySql, к которым я присоединяюсь в запросе, чтобы получить пары идентификатор / значение.

   |    A     |       B      |     C         |
   | -------- |--------------|---------------|
   |   id     |  id          |  id           |
   |   name   |  fooId       |  attributeId  |
   |   desc   |  value       |  displayIndex |
   |   ...    |  attributeId |  ...          |

Теперь у меня есть:

SELECT C.id, B.value
  FROM  A, B, C
  WHERE A.id = B.attributeId
    AND A.id = C.attributeId
    AND B.fooId = 25
  ORDER BY C.displayIndex

Итак, в основном мы соединяем B и C через A. Раньше считалось, что запись в таблице C должна иметьсоответствующая (родительская) запись в таблице А.Однако это больше не будет иметь место.Таблица C по-прежнему ДОЛЖНА управляться таблицей A, однако в некоторых случаях нам нужна отдельная (всегда включенная) запись в таблице C.

EDIT

Я хочу, чтобы все записи из B и C совпадали по attributeId, но я также хочу любую запись, где C.attributeId = -1.Может ли кто-нибудь помочь с тем, что мне нужно сделать с этим запросом?

Редактировать # 2

На основе отзывов и предложений, которые вы, ребята, сделали, и некоторого поиска в Google сейчасесть это:

(SELECT C.id, B.value, C.displayIndex
  FROM  B, C
  WHERE B.attributeId = C.attributeId
    AND B.fooId = 25)

UNION

(SELECT C.id, null, C.displayIndex
  FROM C
  WHERE C.attributeId = -1)

ORDER BY 3

Есть ли что лучше сделать?Есть ли проблемы с UNION?

Ответы [ 2 ]

5 голосов
/ 24 ноября 2011

Я обновил свой ответ, чтобы исправить изменения, внесенные в ОП.

Это вернет все записи where the attributeId for tables B and C match,
с B.fooId = 25, OR C.attributeId = -1.
Если C.attributeId = -1 и в таблице B нет совпадений, вместо B.Value будет возвращено NULL, что представляется приемлемым на основании Edit #2 из OP

SELECT C.Id, B.Value, C.displayIndex
FROM C 
LEFT JOIN B ON C.attributeId = B.attributeId
WHERE B.fooId = 25
   OR C.attributeId = -1
ORDER BY C.DisplayIndex ASC
0 голосов
/ 24 ноября 2011

Возможно, вы получаете декартово произведение.

Как сказал Адам Венгер, вам нужно присоединиться к ним. Внутренние объединения возвращают строки, если во всех объединяемых таблицах есть хотя бы 1 совпадение.

Если вам нужно убедиться, что результат также указан в таблице A, вам также нужно присоединиться к нему:

SELECT c.Id, b.Value
FROM B 
INNER JOIN A ON B.attributeId = A.ID
INNER JOIN C ON B.attributeId = C.attributeId
WHERE B.fooId = 25
   AND C.attributeId = -1
ORDER BY C.DisplayIndex
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...