MySQL Запрос, обращающийся к трем таблицам: сколько из A не в B или C?
Вопрос
У меня есть проблема, сформулирующая запрос 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
без соответствующего идентификатора в двух других таблицах.