MySQL Запрос, обращающийся к трем таблицам: сколько из A не в B или C?

StackOverflow https://stackoverflow.com/questions/9355066

  •  28-10-2019
  •  | 
  •  

Вопрос

У меня есть проблема, сформулирующая запрос MySQL для выполнения следующей задачи, хотя я видел, как здесь обсуждаются подобные запросы, они достаточно отличаются от этого, чтобы снукера, мои попытки их транспонировать. Проблема (довольно) прост в заявлении. У меня есть три таблицы, «члены», «Dog_shareoffered» и «Dog_sharewanted». Участники могут иметь ноль, одна или несколько рекламных объявлений для вещей, которые они хотят продать или хотят купить, а детали хранятся в соответствующей предложенной или разыскиваемой таблице вместе с идентификатором участника, который разместил объявление. Столбец «ID» уникален для участника и общий для всех трех таблиц. Запрос, который я хочу, состоит в том, чтобы спросить, сколько участников не разместили объявление ни в одном таблице.

Я попробовал несколько способов спросить об этом. Самый близкий, который я могу получить, - это запрос, который не рухнул! (Я не являюсь экспертом MySQL в любом случае). Ниже я собрал из того, что я взял из других примеров, но он возвращает нулевые ряды, где я знаю, что результат должен быть больше, чем нуль.

SELECT id 
  FROM members 
 WHERE id IN (SELECT id 
                FROM dog_sharewanted 
               WHERE id IS NULL) 
   AND id IN (SELECT id 
                FROM dog_shareoffered 
               WHERE id IS NULL)

Этот запрос выглядит приятно понимать, в отличие от «Join's», я видел, но я предполагаю, что, возможно, мне нужно какое -то присоединение, но как это будет выглядеть в этом случае?

Это было полезно?

Решение

Если вы не хотите рекламы в либо Таблица, тогда тот вопрос, который вы хотите, - это:

SELECT id
FROM members
WHERE id NOT IN ( any id from any other table )

Чтобы выбрать идентификаторы из других таблиц:

SELECT id
FROM <othertable>

Следовательно:

SELECT id
FROM members
WHERE id NOT IN (SELECT id FROM dog_shareoffered)
 AND  id NOT IN (SELECT id FROM dog_sharewanted)

Я добавил «Select Contimit», потому что один участник может разместить многие объявления, но есть только один идентификатор. Раньше у меня был SELECT DISTINCT В приведенных выше подчинках, но, как упоминалось ниже, это не обязательно.

Если вы хотите избежать подзадачи (возможного повышения производительности, в зависимости от ...) вы можете использовать некоторые левые соединения:

SELECT members.id
FROM members
LEFT JOIN dog_shareoffered
 ON dog_shareoffered.id = members.id
LEFT JOIN dog_sharewanted
 ON dog_sharewanted.id = members.id
WHERE dog_shareoffered.id IS NULL
  AND dog_sharewanted.id IS NULL

Почему это работает:

Это берет стол members и присоединяется к двум другим таблицам на id столбец. А LEFT JOIN означает, что если участник существует в members Стол, но нет Таблица, к которой мы присоединяемся (например, dog_shareoffered), затем соответствующий dog_shareoffered столбцы будут иметь NULL в них.

Итак WHERE Условие выбирает ряды, где есть NULL ID в обоих dog_shareoffered а также dog_sharewanted, то есть мы нашли идентификаторы в members без соответствующего идентификатора в двух других таблицах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top