Возникли проблемы при написании SQL-запроса отношения "многие ко многим"

У меня есть приложение Django со следующими таблицами postgres db: публикация и тег

Publication {
    title
    tags
}

Tag {
    title
}

Тег и публикация имеют много-много-многократные связи.

То, что я хочу сделать, это выполнить поиск и / или комбинированный поиск: например, скажем, у меня есть четыре тега: A, B, C, D. Я хочу найти все публикации, с которыми связан тег A OR B, И тег C OR D, связанный с ним. Например, в поле поиска я мог бы ввести: (A || B) && (C || D). Другими словами, результаты должны давать публикации, в которых есть хотя бы один тег из каждой пары 'или'.

Я хотел бы иметь возможность вводить заголовки тегов и возвращать заголовки публикаций.

Я попытался сделать это с помощью фильтра Django и даже вчера задал этот вопрос: что такое эффективный способ сделать приложение Django-Postgres для поиска И / ИЛИ? и, наконец, понял, что выполнение необработанного запроса сиквела было, вероятно, лучше. Единственная проблема: я никогда не писал сырое продолжение.

Я только что провел последние пару часов, рассматривая вопрос: как отфильтровать результаты SQL в отношении " многостраничный" и пытаться применить его к моим обстоятельствам, но я слишком много новичка, чтобы уметь это делать. Это.

Учитывая мои модели, кто-нибудь может показать мне, как построить этот запрос?

1 ответ

Решение

Конечно, у вас будет таблица, реализующая отношение n:m. подобно

publication_tag {
    publication_id
    tag_id
}

Тогда ваш запрос может выглядеть так:

SELECT p.publication_id, p.publication
FROM   publication p
WHERE  EXISTS (SELECT 1 FROM publication_tag
               WHERE  publication_id = p.publication_id
               AND    tag_id IN ('A', 'B')
              )
AND    EXISTS (SELECT 1 FROM publication_tag
               WHERE  publication_id = p.publication_id
               AND    tag_id  IN ('C', 'D')
              )

Это должно быть одним из самых быстрых возможных решений. Вы уже нашли переходящий вопрос с гораздо большим количеством примеров запросов для реляционного разделения.

Другие вопросы по тегам