具有多个结果的子查询合并为一个字段?

时间:2010-06-16 18:25:10

标签: sql mysql aggregate-functions group-concat

假设我有这些表,我需要在浏览器中显示搜索结果:

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       

我只能在子查询中返回一个结果,所以我不知道该怎么做。

1 个答案:

答案 0 :(得分: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”。