Выберите повторяющиеся значения - PullRequest
0 голосов
/ 29 октября 2018
table1  dorm_ID   Person_ID
          145       66689
          146       66692
          150       66585
          151       68989

table2    P1      P2    Relationship
         78989  66689      Roommate
         58596  66689      Bio teacher
         79858  66689      English teacher
         88859  66692      Roommate
         58597  66692      English teacher
         98557  66585      Roommate
         98999  68989      Chemistry teacher
         98992  68989      English teacher

Я хочу выбрать dorm_ID с соседом по комнате и учителем английского языка в качестве отношений. Мне нужно присоединиться к таблице на Person_ID = P2. Есть ли способ, которым вы можете настроить запрос, который выбирает дубликаты значений dorm_id (если они есть), а затем выбирают только те, которые имеют отношение "Roomate" или "Учитель английского языка".

Мое ожидаемое значение:

   dorm_ID   Person_ID     P1     P2      Relationship
     145       66689      78989  66689      Roommate
     145       66689      79858  66689      English teacher
     146       66692      88859  66692      Roommate
     146       66692      58597  66692      English teacher

Я пытался использовать запросы, включающие HAVING COUNT (*), но это не помогло. Я не хочу, чтобы количество дубликатов, я хочу, чтобы дубликаты были сгруппированы вместе.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Попробуйте это:

    Select 
  a.dorm_id, 
  a.person_id, 
  b.p1, 
  b.p2, 
  b.relationship 
FROM table1 a 
  JOIN (
    Select 
      p1, 
      p2, 
      relationship 
    FROM 
      (
        Select p2 
        FROM table2 
        WHERE relationship in ('Roommate', 'English teacher') 
        GROUP BY p2 
        HAVING count(*) > 1
      ) b 
      JOIN table2 c ON c.p2 = b.p2 
    WHERE c.relationship in ('Roommate', 'English teacher')
  ) d ON a.Person_ID = d.P2;
0 голосов
/ 29 октября 2018

Это не совсем тот вывод, который вы хотите, но он содержит ту же информацию:

select t1.dorm_id, t1.person_id,
       group_concat(distinct t2.p1),
       group_concat(distinct t2.p2)
from table2 t2 join
     table1 t1
     on t2.p1 = t1.person_id 
group by t1.dorm_id, t1.person_id
having sum(case when t2.relationship = 'Roommate' then 1 else 0 end) > 0 and
       sum(case when t2.relationship = 'English teacher' then 1 else 0 end) > 0;
...