Фильтрация по многим элементам во многих отношениях без использования HAVING?
Есть ли способ написать параметрический запрос SQL, который сопоставляет заметки, связанные с несколькими проектами, без использования HAVING?
Скажем, у меня есть таблица "notes", таблица "projects" и таблица "notes_projects", связывающая эти два элемента. Я хочу найти примечания, связанные со всеми идентификаторами проекта в предложении IN. Вот версия с HAVING:
SELECT notes.*, COUNT(np.project_id) AS np_count
FROM notes
INNER JOIN notes_projects AS np
ON np.note_id = notes.id
WHERE np.project_id IN (?)
GROUP BY notes.id
HAVING np_count = 2;
Есть ли способ не использовать предложение HAVING или это правильный способ обработки таких случаев?
1 ответ
Не присоединяйтесь к таблице ссылок, потому что это меняет количество строк. Сформулируйте запрос, используя EXISTS
:
SELECT *
FROM notes n
WHERE EXISTS (
SELECT *
FROM notes_projects AS np
WHERE np.note_id = notes.id AND np.project_id IN (?)
)
(Группировка в вашем запросе была создана для устранения проблем, вызванных объединением.)
Вот версия, которая требует, чтобы все проекты были найдены:
SELECT *
FROM notes n
WHERE NOT EXISTS (
SELECT *
FROM notes_projects AS np
WHERE np.note_id = notes.id AND np.project_id NOT IN (?)
)