2015-10-15 62 views
0

我有一個數據庫包含三個表:醫生,辦公室,專業。 醫師表包含醫師姓名。同樣,辦公室的表格包含辦公地址,專業包含醫生在實踐中的不同專業。MySQL查詢3錶鏈接2鏈接表

因爲醫生和辦公室是相關的多對多,所以我有一個鏈接表,j_md_ofc。同樣,我有一個鏈接表j_md_spc,用於醫生和他們的專業之間的多對多關係。

我很難創建一個查詢,列出在特定辦公室工作的醫生及其專業人員。最終的目標是要在網頁上顯示給定的辦公以下:

  1. 李四博士 - 關節置換
  2. Lumbergh博士 - 關節置換術,運動醫學
  3. Soze博士 - 運動醫學,肩部手術,手部手術
  4. 斯旺森博士 - 運動醫學,肩部手術,關節置換

從查詢到創建網頁所需要的PHP的結果得到的是沒有問題的。創建查詢是我卡住的地方。它可以用一個簡單的(嵌套的)查詢來完成,還是它必須是2個獨立的查詢?

+2

您應該能夠在單個查詢中使用4個INNER JOIN子句進行操作。要用逗號分隔的列表獲得特色,請使用「GROUP_CONCAT」。 – Barmar

+0

作爲@Barmar的四個JOIN表示。您也可以使用LEFT或RIGHT JOIN列出沒有特色的醫師。 –

+1

這裏有很多關於在連接表之間進行表連接的問題。第二個鏈接表並沒有真正改變任何東西,你只是重複相同的模式。 – Barmar

回答

0

像這樣的東西應該工作(應該有更快的方式雖然):

SELECT p.`name`, GROUP_CONCAT(s.name) from physician p 
    /* Join physician and office */ 
    INNER JOIN j_md_ofc p2o 
    ON (p.id = p2o.physician_id) 
    /* Join speciality and physician */ 
    INNER JOIN j_md_spc p2s 
    ON (p.id = p2s.physician_id) 
    /* Join speciality_id with speciality name */ 
    INNER JOIN speciality s 
    ON (s.id = p2s.speciality_id) 
    /* Join office_id with office name */ 
    INNER JOIN office o 
    ON (o.id = p2o.office_id) 
WHERE o.name = "a" 
GROUP BY p.name 
+1

謝謝。您收錄的評論非常有幫助。我正在解決這個問題,並在連接中嵌套連接。出於某種原因,我無法用多對多的關係來解決問題。再次感謝。 –

+1

@AnthonyWatson對我來說,它有助於以非顯式加入的方式來思考它,比如:select ax,by,cz from a,b,c WHERE a.id = b.some_id AND c.id = b.some_other_id – SleepProgger

+0

@SleepProgger這實際上是理解這些事情的好辦法。我總是與關係數據庫鬥爭 – danjbh

0
select physician_name, specialty_name, ... 
from 
    physicians p 
    inner join physician_offices po 
     on po.physician_id = p.physician_id 
    inner join physician_specialities ps 
     on ps.physician_id = p.physician_id 
    inner join specialities s 
     on s.specialty_id = ps.specialty_id 
where 
    po.office_id = ? 

或可能在表/列名更好的猜測:

select md.name, spc.name, ... 
from 
    md 
    inner join j_md_ofc mo 
     on mo.md_id = md.md_id 
    inner join j_md_spc ms 
     on ms.md_id = md.md_id 
    inner join spc 
     on spc.spc_id = ms.spc_id 
where 
    mo.ofc_id = ?