2015-10-08 2 views
0
PERSON 
--------------------- 
ID   NAME 
1   ALEX 
2   BOB 
3   JAMES 

PERSON_FRUIT 
--------------------- 
PERSON_ID FRUIT_ID 
1   1 
2   1 
3   2 

FRUIT 
--------------------- 
ID   NAME 
1   APPLE 
2   ORANGE 

Как написать запрос, который проверяет, есть ли у одного человека один и тот же плод? Мне нужен запрос, который дает мне следующие результаты.Как получить общий ряд таблиц отношений ManyToMany

  • Если я перейду в ALEX и BOB, он вернет фрукты, которые у них есть, что есть APPLE.
  • Если я перейду в ALEX, BOB и JAMES, он вернет 0 строк, потому что у них нет общих плодов.

Я пытался использовать ниже запрос

select 
    F.NAME 
from 
    PERSON P1 
    join PERSON_FRUIT PF1 on P1.ID = PF1.PERSON_ID 
    join PERSON_FRUIT PF2 on PF1.FRUIT_ID = PF2.FRUIT_ID 
    join PERSON P2 on PF2.PERSON_ID = P2.ID 
    join FRUIT F on F.ID = PF1.FRUIT_ID 
where 
    P1.ID = 1 and P2.ID = 2 and P1.ID <> P2.ID; 

, чтобы получить общий плод ALEX и ЛПП, но этот запрос ограничен, чтобы пройти в 2-х человек только.

+0

В какой СУБД не остается результатов? И я думаю, что другая проблема (не упомянутая) у вас есть, как передать различное количество идентификаторов людей. – niksofteng

+0

Это просто делается в одном SQL-запросе или используется еще один бит кода? – Nerdwood

+0

@vnikhil Я использую postgres, в настоящее время у меня есть способ принять два параметра (person1Id, person2Id), я бы хотел передать массив personIds, если бы нашел лучший SQL-запрос –

ответ

0

С помощью этого запроса вам необходимо указать людей как список идентификаторов (в предложении WHERE), и вам нужно указать общее количество идентификаторов человека (в предложении HAVING).

SELECT F.Name 
FROM person_fruit PF INNER JOIN fruit F ON PF.Fruit_ID = F.ID 
WHERE PF.Person_ID IN (1,2,4) '<- List of person IDs' 
GROUP BY PF.Fruit_ID 
HAVING COUNT(Person_ID) = 3  '<- Total number of person IDs' 
+0

выглядит как работающий отлично, спасибо –

+0

Отлично, рад помочь! :) – Nerdwood

Смежные вопросы