2013-03-20 4 views
1

У меня есть три таблицы базы данных (MySQL) Упростить до следующей информации:три таблицы объединения данных из первого и третьего

=============== 
member 
--------------- 
id 
FirstName 
=============== 

member.id = quote_details.member_id

=============== 
quote_details 
--------------- 
member_id 
insurer_id 
=============== 

quote_details.insurer_id = insurer.id

=============== 
insurer 
--------------- 
id 
Name 
=============== 

То, что я хотел бы выход member.FirstName и insurer.Name, поэтому я понимаю, что мне потребуются объединения между всеми таблицами - например, member> quote_details, а затем quote_details> страховщик. Я изо всех сил борюсь с типами соединений и надеюсь, что кто-то сможет указать мне в правильном направлении.

Заранее благодарим за любые ответы.

С уважением,

Нил

редактировать уточнить:

Я попытался INNER JOIN через три, но который возвращает список всех страховщиков с FirstName из запрашиваемых элемента:

========================== 
FirstName | Insurer 
-------------------------- 
Test  | Insurer One 
Test  | Insurer Two 
Test  | Insurer Three 
========================== 

Место, где мне требуется только фактический страховщик, которому присваивается котировка участника. Надеюсь, это поможет немного прояснить ситуацию.

редактировать, чтобы добавить образец данных:

=================== 
member 
------------------- 
id | FirstName 
- - - - - - - - - - 
1 | Test 
2 | John 
3 | Jane 
=================== 

======================= 
quote_details 
----------------------- 
member_id | insurer_id 
- - - - - - - - - - - - 
     1 |   1 
======================= 

=================== 
insurer 
------------------- 
id | Name 
- - - - - - - - - - 
1 | Insurer One 
2 | Insurer Two 
3 | Insurer Three 
=================== 

Это, мы надеемся, предоставляет всю ясность в настоящее время: ¬)

+0

Первый шаг на пути к determinig соответствующий тип соединения является определяющим, какие записи должны появиться в наборе результатов , – Oswald

ответ

0

В основном, INNER JOIN будет достаточно ваших потребностей, если обе колонки в таблице quote_details являются Ненулевые столбцов.

SELECT b.FirstName MemberName, 
     c.Name InsurerName 
FROM quote_details a 
     INNER JOIN member b 
      ON a.member_ID = b.id 
     INNER JOIN insurer c 
      ON a.insurer_ID = c.ID 

Для дальнейшего получить больше знаний о присоединяется, любезно перейдите по ссылке ниже:

+0

Спасибо за ваш ответ, это то, что я попробовал вначале, но проблема в том, что тогда он возвращает список всех страховщиков, а не страховщика, которому присваивается цитата и цитата, назначенные члену. 'FirstName, Страховщик' ' -------------------- ' ' Тест, страховщик один' 'Тест, страховщик два' ' Тест, страховщик три' Надеюсь, это поможет. –

+0

Вы пытались выполнить запрос? Думаю, вы пропустили этот момент. Как вы можете видеть, мы соединяем два столбца 'quote_details' с двумя идентификаторами:« член »и« страховщик »через их идентификатор. –

+0

, чтобы сделать его более понятным, можете ли вы предоставить образцы записей (* по крайней мере 3-4 записи по каждому *) с вашим желаемым результатом, чтобы мы могли играть с данными. –

0

Ваши данные настроенное, чтобы член иметь несколько страховщиков (и вице- Versa). Если вы хотите, чтобы все страховщики на той же строке, вам нужно сделать агрегацию:

select m.FirstName, group_concat(i.Name separator ', ') as Insurers 
from member m inner join 
    quote_details qd 
    ON qd.member_ID = m.id inner join 
    insurer i 
    ON qd.insurer_ID = i.ID 
group by m.FirstName 

При подаче таблицы псевдонимов, использовать разумные сокращения, а не «а», «б», «в», и т.д. . Разумные сокращения делают запрос намного понятнее.

Если у вас есть участники без страховщиков, они не будут отображаться на выходе.Если вы хотите, чтобы все из них, а затем использовать left outer join:

select m.FirstName, group_concat(i.Name separator ', ') as Insurers 
from member m left outer join 
    quote_details qd 
    ON qd.member_ID = m.id left outer join 
    insurer i 
    ON qd.insurer_ID = i.ID 
group by m.FirstName 

Если вы хотите их на отдельных строках:

select m.FirstName, i.Name 
from quote_details qd inner join 
    member m 
    ON qd.member_ID = m.id inner join 
    insurer i 
    ON qd.insurer_ID = i.ID