2012-08-04 111 views
2

我有三個表:項目,列表,項目。加入三個表的MySQL查詢

該項目加入到project_id的列表中,並且這些項目加入到list_id的列表中,並且目標是獲取每個列的所有行數據。

我試過了什麼? 那麼,我實際上只能通過有三個單獨的查詢/輸出,然後通過PHP迭代他們來組合數據。

是否有可能編寫查詢,這樣我最終得到一個數據對象,我可以輕鬆地迭代?

project (w details) 
-- list (and its details) 
----- item (w details) 
----- item (w details) 
----- item (w details) 
-- list (w details) 
----- item (w details) 
----- item (w details) 

回答

5

你的意思是這樣的:

select 
    a.project_id, 
    b.list_id, 
    c.item_id 
from 
    projects a 
     join lists b 
      on a.project_id=b.project_id 
     join items c 
      on b.list_id=c.list_id 

輸出將是這樣的:

project_id | list_id | item_id 
1   | 5  | 45 
1   | 5  | 46 
1   | 8  | 12 

還是你想返回它的所有部件在單行?

如果你想有一個單列,你可以做線沿線的東西:

select 
    a.project_id, 
    group_concat(b.list_id) as listIDs, 
    group_concat(c.item_id) as itemIDs 
from 
    projects a 
     join lists b 
      on a.project_id=b.project_id 
     join items c 
      on b.list_id=c.list_id 

但它會在PHP中得到梅西耶處理所有的分組東西。

輸出將是這樣的:

project_id | list_id | item_id 
1   | 5,8  | 45, 46, 12 

你也可以混合和匹配的兩到可能得到兩全其美的:

select 
    a.project_id, 
    b.list_id as listIDs, 
    group_concat(c.item_id) as itemIDs 
from 
    projects a 
     join lists b 
      on a.project_id=b.project_id 
     join items c 
      on b.list_id=c.list_id 

輸出將是這樣的:

project_id | list_id | item_id 
1   | 5  | 45, 46 
1   | 8  | 12 
+0

嗯,是的,我認爲是。我希望能夠將所有這些數據發送到視圖。 – Kristian 2012-08-04 06:49:52

+0

@Kristian不,你在單行中只有少量冗餘數據,但是你必須在PHP中做更多的詭計才能將它們全部分離出來。我正在考慮諸如'group_concat()'之類的東西來將所有項目放在一起。 – Fluffeh 2012-08-04 06:51:18

+0

感謝兄弟。好的,我只是更新了我的問題,在得到兩個回覆之後我意識到,我應該說我需要整個行。但我認爲這是不可能的,當行不真正匹配關鍵字,對不對? – Kristian 2012-08-04 06:54:03

1

試試這個:如果你想顯示你的投影方式

select 
    a.project_id, 
    b.list_id, 
    c.item_id 
from 
    projects a 
    left join lists b on a.project_id=b.project_id 
    left join items c on b.list_id=c.list_id 
    order by b,c