Объединить три таблицы в MySQL? - PullRequest
3 голосов
/ 09 февраля 2012

У меня есть три таких таблицы:

лицо

id | name   | location
-----------------------
 1 | ABC    | Location1
 2 | XYZ    | Location2

Контакт

id | type    | contact
---------------------------
 1 | website | abc.com
 2 | email   | abc@abc.com
 3 | website | xyz.com
 4 | email   | xyz@xyz.com

PersonContact

Person_id | Contact_id
-----------------------
    1     |    1
    1     |    2
    2     |    3
    2     |    4

Я хочу получить результат примерно так:

id | name | website | email
----------------------------------
 1 | ABC  | abc.com | abc@abc.com
 2 | XYZ  | xyz.com | xyz@xyz.com 

Ответы [ 3 ]

3 голосов
/ 09 февраля 2012

Есть несколько способов сделать это, но вот простой для MySQL

SELECT
   p.id,
   p.name,
   MAX(IF(c.type = 'website', c.contact, NULL)) AS 'website',
   MAX(IF(c.type = 'email', c.contact, NULL)) AS 'email'
FROM
   Person p INNER JOIN
   PersonContact pc ON p.id = pc.Person_ID INNER JOIN
   Contact c ON pc.contact_id = c.id
GROUP BY p.id
2 голосов
/ 10 февраля 2012

Интересно, насколько сложным будет этот запрос без использования операторов if.Это фактически одно левое соединение на столбец!Отличная работа @Ben!

select p.id, p.name, max(website) as website, max(email) as email from person p
join personContact pc on p.id = pc.person_id
join contact c on pc.contact_id = c.id
left join (
  select c.id as cid, c.contact as website from personContact pc
  join contact c on pc.contact_id = c.id
  where c.type = 'website'
) as WebsiteCol
on c.id = WebsiteCol.cid
left join (
  select c.id as cid, c.contact as email from personContact pc
  join contact c on pc.contact_id = c.id
  where c.type = 'email'
) as EmailCol
on c.id = EmailCol.cid
group by p.id, p.name
0 голосов
/ 09 февраля 2012
SELECT p.id, p.name, c.contact FROM Person p, PersonContact pc , Contact c WHERE p.id = pc.Person_id AND pc.Contact_id= c.id 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...