Выглядит просто, но я в тупике! - PullRequest
0 голосов
/ 01 сентября 2009

Это должно быть так просто, но я рисую пробел. У меня есть две таблицы.

Table:article_tag_pvt
colum: article_id
column: tag_id

Table: tag
column: tag_id
column: name

Таблица article_tag_pvt является сводной таблицей «многие ко многим».

Проблема в том, что мне нужен запрос, в котором указан список имен тегов, он получит идентификаторы статей, которые ТОЛЬКО соответствуют этим именам тегов. Основное объединение этих таблиц выглядит следующим образом:

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id

Я уже получил запрос, который будет получать идентификаторы статей, которые соответствуют ЛЮБЫМ указанным именам тегов. Это выглядит так:

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id
WHERE t.name IN ('events','news')

Я пробовал это, но без радости:

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id
WHERE t.name = 'events' AND t.name = 'news'

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN (
SELECT tag_id
FROM tag
WHERE name IN ('events','news')
) AS t
ON t.tag_id = pvt.tag_id

Любая помощь будет принята с благодарностью

Dave

Ответы [ 2 ]

3 голосов
/ 01 сентября 2009

Проблема в том, что вы получаете ВСЕ строки, в которых есть события или новости. Если у вас никогда не бывает более 1 события или новостей в таблице «многие ко многим», вы можете использовать GROUP BY и HAVING для их решения

SELECT article_id
FROM article_tag_pvt pvt
INNER JOIN tag t ON t.tag_id = pvt.tag_id
WHERE t.name = 'events' OR t.name = 'news' 
GROUP BY article_id HAVING count(*) = 2
2 голосов
/ 01 сентября 2009

Мои предпочтения:

SELECT pvt.article_id
  FROM article_tag_pvt pvt
  JOIN tag t ON t.tag_id = pvt.tag_id AND t.name = 'events'
  JOIN tag t2 ON t2.tag_id = pvt.tag_id AND t2.name = 'news'

Альтернатива с использованием GROUP BY / HAVING:

  SELECT pvt.article_id
    FROM article_tag_pvt pvt
    JOIN tag t ON t.tag_id = pvt.tag_id
   WHERE t.name IN ('events', 'news')
GROUP BY pvt.article_id, t.name
  HAVING COUNT(DISTINCT t.name) = 2

COUNT (DISTINCT t.name) должно быть равно количеству опций, которые вы определяете для предложения t.name IN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...