2010-06-16 59 views
0

假設我有這些表,從中我需要在瀏覽器中顯示的搜索結果:將多個結果組合爲單個字段的子查詢?

Table: Containers 

id | name 
1  Big Box 
2  Grocery Bag 
3  Envelope 
4  Zip Lock 


Table: Sale 

id | date  | containerid 
1  20100101 1 
2  20100102 2 
3  20091201 3 
4  20091115 4 


Table: Items 

id | name  | saleid 
1  Barbie Doll 1 
2  Coin   3 
3  Pop-Top  4 
4  Barbie Doll 2 
5  Coin   4 

我需要輸出,看起來像這樣:

itemid itemname  saleids  saledates  containerids  containertypes 
1  Barbie Doll 1,2 20100101,20100102  1,2  Big Box, Grocery Bag 
2  Coin   3,4 20091201,20091115  3,4  Envelope, Zip Lock 
3  Pop-Top   4   20091115   4    Zip Lock 

的重要組成部分,是每個項目類型只在屏幕上返回一個記錄/行。過去,我通過返回多行相同的項目並使用腳本語言來限制輸出來完成此任務。但是,這使得ui過於複雜和糟糕。所以,我希望我可以讓數據庫只顯示與顯示行數一樣多的記錄。

這個例子可能有點極端,因爲從物品到達貨櫃(通過銷售表)需要2個連接。

我會很高興的只是輸出這樣一個例子查詢:

itemid itemname  saleids  saledates  
1  Barbie Doll 1,2 20100101,20100102 
2  Coin   3,4 20091201,20091115 
3  Pop-Top   4   20091115  

我只能在一個子查詢返回一個結果,所以我不知道如何做到這一點。

+3

您正在使用哪種RDBMS? – 2010-06-16 18:27:01

回答

2

假設你使用MySQL(你有,只有一個被標記爲MySQL的四個問題),該GROUP_CONCAT function是你追求的:

SELECT i.name AS itemname, 
     GROUP_CONCAT(s.id ORDER BY s.id) AS salesids, 
     GROUP_CONCAT(s.date ORDER BY s.date) AS salesdates, 
     GROUP_CONCAT(s.containerid ORDER BY s.containerid) AS containerids, 
     GROUP_CONCAT(c.name ORDER BY c.name) AS containertypes 
    FROM ITEMS i 
    JOIN SALE s ON s.id = i.salesid 
    JOIN CONTAINERS c ON c.id = s.containerid 
GROUP BY i.name 

如果你想有可能沒有項目指向SALES和/或CONTAINERS表的鏈接 - 在「JOIN」前添加「LEFT」。

+0

這個工作完美,除了group by應該是i.name(以避免重複的同一個項目名稱的行)。 謝謝你這個優秀的答案。 – Todd 2010-06-16 19:15:22

+0

塔爾去,先生(或女士)。 – Todd 2010-06-16 19:38:40

+0

@Todd:你的意思是「種馬」或「母馬」 - 當然不是閹割:) http://wiki.answers.com/Q/Other_gender_for_horse – 2010-06-16 19:54:04

相關問題