Возникли проблемы при написании 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')
)
Это должно быть одним из самых быстрых возможных решений. Вы уже нашли переходящий вопрос с гораздо большим количеством примеров запросов для реляционного разделения.