SQL-запрос «многие ко многим» с избыточным ограничением - PullRequest
1 голос
/ 23 февраля 2012

Удивительно, но я ничего не нашел в своем вопросе.Надеюсь, я не выглядел слишком плохо.

Итак, я получил три таблицы, назовем их: Документы, Темы и переходная таблица "многие ко многим" DocumentsTopics

Iнужно иметь возможность искать некоторые документы , которые "содержат" только темы 8 и 15 .Как мне это сделать ?Потому что в следующем примере:

select Documents.title from Documents
inner join DocumentsTopics
on Documents.PK_DOC = DocumentsTopics.FK_DOC
inner join Topics
on DocumentsTopics.FK_TOPICS = Topics.PK_TOPICS

where Topics.PK_TOPICS=8 and Topics.PK_TOPICS=15;

«Где», очевидно, невозможно.Большое спасибо тем, кто может помочь!

Кристоф

Ответы [ 3 ]

1 голос
/ 23 февраля 2012
select Documents.title from Documents 
join DocumentsTopics on Documents.PK_DOC = DocumentsTopics.FK_DOC 
join Topics on DocumentsTopics.FK_TOPICS = Topics.PK_TOPICS
where Topics.PK_TOPICS=8 or Topics.PK_TOPICS=15;
1 голос
/ 23 февраля 2012

Если должны отображаться только те документы, в которых существуют обе темы: 8 и 15, то подойдет любой из приведенных ниже подходов (плюс еще несколько) - проверьте план запросов и т. Д. На предмет производительности.Второй работает лучше для меня.

select distinct d.title
from Documents d
  inner join DocumentsTopics dt8 on dt8.fk_doc = d.pk_doc and dt8.fk_topics = 8
  inner join DocumentsTopics dt15 on dt15.fk_doc = d.pk_doc and dt15.fk_topics = 15

select d.title
from Documents d
where exists (select * from DocumentsTopics where fk_topics = 8 and fk_doc = d.pk_doc)
  and exists (select * from DocumentsTopics where fk_topics = 15 and fk_doc = d.pk_doc)
0 голосов
/ 05 октября 2013

Ну, я думаю, что я не очень ясно в своем описании.Но решение, которое я нашел, состоит в том, чтобы идти по шагам, не используя только SQL, но с PHP.

Я делаю первый повторный поиск с первым критерием:

where Topics.PK_TOPICS=8

Я получаю результат в массиве PHP.Затем второй со вторым критерием:

where Topics.PK_TOPICS=15

Я получаю результаты в другом временном массиве PHP.А затем я использую PHP array_intersect ():

$results = array_intersect($results, $temp_results);

, чтобы найти только результаты, которые соответствуют обоим критериям.Очевидно, я могу повторно использовать результаты $, чтобы пересекаться столько раз, сколько я хочу.Таким образом, нет ограничений для поисковых критериев.

Надеюсь, эта помощь ...

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