Хотя ответ APC будет синтаксически правильным, если проблема, которую вы пытаетесь решить, действительно такова: «Найдите мне все новые теги, у которых нет news_tags_entries», тогда запрос с INNER JOIN
и GROUP BY
и HAVING
не даст правильный результат. Фактически, он всегда будет давать пустой набор.
Как указал Игнасио Васкес Абрахамс, LEFT JOIN
будет работать. И вам даже не нужны GROUP BY
/ HAVING
:
SELECT news_tags.*
FROM news_tags
LEFT JOIN news_tags_entries
ON news_tags.tag_id = news_tags_entries.tag_id
WHERE news_tags_entries.tag_id IS NULL
(Конечно, вы все равно можете добавить GROUP BY
и HAVING
, если вам интересно узнать, сколько существует записей, а не просто хотите найти news_tags
с нулем news_tags_entries
. Но LEFT JOIN
от news_tags до news_tags_entries должен быть там, иначе вы потеряете теги news, у которых нет соответствующих элементов в news_tags_items)
Другой, более явный способ решить «достань мне все x, для которого нет y» - это коррелированное NOT EXISTS
решение:
SELECT news_tags.*
FROM news_tags
WHERE NOT EXISTS (
SELECT NULL
FROM news_tags_entries
WHERE news_tags_entries.tag_id = news_tags.tag_id
)
Хотя это и симпатичное и явное решение, в MySQL его обычно избегают из-за довольно низкой производительности подзапроса