Фильтрация по многим элементам во многих отношениях без использования HAVING?

Есть ли способ написать параметрический запрос SQL, который сопоставляет заметки, связанные с несколькими проектами, без использования HAVING?

SQLfiddle

Скажем, у меня есть таблица "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 (?)
)
Другие вопросы по тегам