MySql: Проверьте, где предложение для всей строки, возвращаемой внутренним соединением - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть этот запрос

SELECT *
FROM posts
INNER JOIN categories ON categories.post_id = posts.id
INNER JOIN tags ON tags.category_id = categories.id
WHERE tags.title = 'week_trend'

Каждое сообщение имеет несколько категорий, а также каждая категория имеет несколько тегов, и мне нужны сообщения, которые имеют категории с указанным тегом, но все категории сообщений должны иметь это условие и даже если одна из этих категорий не соответствует условию, сообщение не должно быть включено. Мой запрос возвращает сообщения, даже если одна из их категорий имеет указанный тег.

Я почти не представляю, как это сделать, может кто-нибудь мне помочь tnx

1 Ответ

0 голосов
/ 08 февраля 2020

Этот запрос:

SELECT c.post_id
FROM categories c INNER JOIN tags t
ON t.category_id = c.id
GROUP BY c.post_id
HAVING COUNT(DISTINCT c.id) = SUM(t.title = 'week_trend')

возвращает все post_id с категориями, которые все связаны с тегом с заголовком 'week_trend'. Используйте его с предложением IN:

SELECT *
FROM posts 
WHERE id IN (
  SELECT c.post_id
  FROM categories c INNER JOIN tags t
  ON t.category_id = c.id
  GROUP BY c.post_id
  HAVING COUNT(DISTINCT c.id) = SUM(t.title = 'week_trend')
)
...