Возникли проблемы при попытке отфильтровать результаты, возвращаемые PostgreSQL, по определенным идентификаторам - PullRequest
0 голосов
/ 15 апреля 2011

Из-за скуки я решил установить простую систему тегов для моих фильмов сегодня.У меня есть список названий фильмов и количество тегов X для каждого фильма.База данных выглядит так:

mydb=# select id, title from movies;

 id |                  title                   
----+----------------------------------------
  1 | first_movie
  2 | second_movie

mydb=# select id, movie_id, tag_id from movie_tags;

 id | movie_id | tag_id 
----+----------+--------
  1 |        1 |    716
  2 |        1 |    787
  3 |        1 |    322
  4 |        2 |    716
  5 |        2 |    787
  6 |        2 |    323

mydb=# SELECT l.id, l.title, t.tag_id FROM movies l, movie_tags t WHERE t.movie_id = l.id AND t.tag_id IN(716, 787, 323);

 id |    title     | tag_id 
----+--------------+--------
  2 | second_movie |    787
  2 | second_movie |    716
  2 | second_movie |    323
  1 | first_movie  |    716
  1 | first_movie  |    787

Это третий запрос, который вызывает у меня проблемы.Во-первых, он показывает дубликаты строк.Новый ряд для каждого tag_id.Я не хочу этогоЯ бы предпочел, чтобы он показывал одну строку для каждого фильма, которая соответствует указанным тегам.

Что приводит меня ко второй проблеме.Как видите, first_movie не помечено tag_id=323.Тем не менее, он по-прежнему отображается в результатах.

Как я не могу показать дубликаты строк и отфильтровать результаты по фильмам, которые соответствуют всем заданным тегам?

Я планировал создать простой пользовательский интерфейс дляэто так, я надеялся на хороший «динамический» запрос, который я мог бы перетащить в список tag_ids.

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

Этот запрос дает вам все фильмы, в которых есть все 3 из найденных тегов.

  SELECT l.id, l.title
    FROM movies l, movie_tags t
   WHERE t.movie_id = l.id
     AND t.tag_id IN (716, 787, 323)
GROUP BY l.id, l.title
  HAVING COUNT(*) = 3

Как видите, столбец тегов удален, так как нет смысла включать один произвольный тег.

0 голосов
/ 15 апреля 2011
SELECT l.id, l.title
FROM movies l
WHERE l.id IN (SELECT t.movie_id 
               FROM movie_tags t 
               WHERE t.tag_id IN (716, 787, 323));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...