@YakovenkoND

Как написать SQL запрос, чтобы при нахождении одной записи с определенным значением поля, другие записи с таким же значением не выводились?

Есть таблица, tag2article. К примеру:

tag_id | article_id
--------------------
1 | 5
2 | 6
7 | 5

Я хочу, чтобы все статьи с тегом не 1 выводились и я пишу в запросе ->andWhere(['!=', 'tag_id', 1]), но в таблице есть запись, где та же статья, но с другим тегом, получается, что эта статья все равно выводится.

Как сделать так, чтобы все записи со статьей 5 не выводились (конечно, статья 5 здесь для примера и в реальной базе нужно, чтобы такое поведение работало не только для статьи с id 5, а для всех случаев повторения статьи, но с другим тегом)?
  • Вопрос задан
  • 167 просмотров
Решения вопроса 2
@Akina
Сетевой и системный админ, SQL-программист.
Общий шаблон такой:

SELECT article_id
FROM tag2article
GROUP BY article_id
HAVING !SUM(tag_id = 1)


Подобный подход позволяет формировать условия любой степени сложности, например:
SUM(tag_id = 2) -- наличие тега 2 обязательно
SUM(tag_id IN (3,4)) -- наличие хотя бы одного из указанных тегов обязательно
!SUM(tag_id IN (5,6)) -- отсутствие любого из указанных тегов обязательно
SUM(tag_id IN (7,8)) = 1 -- обязательно наличие строго одного из двух указанных

Ну и так далее... а с учётом того, что такие условия объединяются логическими операторами, можно состряпать фильтр практически любой сложности.

Конечно, в более простых случаях можно использовать и частные решения, и они будут быстрее общего. Вот как Сергей Паньков предложил.
Ответ написан
Комментировать
trapwalker
@trapwalker
Программист, энтузиаст
SELECT * 
FROM articles a
WHERE NOT EXISTS(SELECT * FROM tag2article ta WHERE ta.tag_id = 5 AND ta.article_id = a.id)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@VVCh
GROUP BY article_id
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы