2010-06-16 178 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

相关问题