假设我有这些表,我需要在浏览器中显示搜索结果:
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
我只能在子查询中返回一个结果,所以我不知道该怎么做。
答案 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”。