SQL-запрос «многие ко многим» для выбора всех изображений, помеченных определенными словами - PullRequest
3 голосов
/ 13 октября 2011

У меня есть 2 таблицы в Postgres:

CREATE TABLE "images" (
    "id" serial NOT NULL PRIMARY KEY,
    "title" varchar(300) NOT NULL,
    "relative_url" varchar(500) NOT NULL)

и

CREATE TABLE "tags" (
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(50) NOT NULL)

Чтобы установить взаимосвязь между многими изображениями и тегами, у меня есть еще одна таблица:

CREATE TABLE "tags_image_relations" (
    "id" serial NOT NULL PRIMARY KEY,
    "tag_id" integer NOT NULL REFERENCES "tags" ("id") DEFERRABLE INITIALLY DEFERRED,
    "image_id" integer NOT NULL REFERENCES "images" ("id") DEFERRABLE INITIALLY DEFERRED)

Теперь мне нужно написать запрос типа " selectlative_url из всех изображений с тегами" apple "и" microsoft "и" google ""

Что может сделать наиболее оптимизированный запросдля этого?

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Вот рабочий запрос, который я написал:

SELECT i.id, i.relative_url, count(*) as number_of_tags_matched
FROM   images i
    join tags_image_relations ti on i.id = ti.image_id
    join tags t on t.id = ti.tag_id
    where t.name in ('google','microsoft','apple')
    group by i.id having count(i.id) <= 3
    order by count(i.id)

В этом запросе сначала будут показаны изображения, соответствующие всем тэгам, затем изображения, соответствующие не менее 2 из 3 тегов, и, наконец, не менее 1 тега.

0 голосов
/ 13 октября 2011

Вы присоедините images к tags_image_relations, затем tags_image_relations к tags, затем отфильтруете WHERE, поле name будет IN список желаемых имен тегов.Это самый простой, самый очевидный и самый чистый?

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