我想从数据库表中打印一个项目列表,并与每个项目一起列出一个相关子项目的小列表(最多10项)。
例如,我有这两个表:
ITEMS
id: integer
name: string
SUBITEMS
id: integer
name: string
item_id: integer
所以,一个项目可以有很多子项。
我想打印这样的东西:
Item 1
this item has: subitem 1, subitem 2, subitem 3
Item 2
this item has: subitem 4, subitem 5, subitem 6
Item 3
this item has: subitem 2, subitem 4, subitem 7
如何在SQL中完成?这甚至可能吗?
答案 0 :(得分:4)
如果是MySQL那么
select i.*, group_concat(si.name) as subitems
from items i
left join subitems si on si.item_id = i.id
group by i.id
答案 1 :(得分:0)
你需要它直接从SQL打印出来吗?
典型的查询看起来像
SELECT i.item_id,si,item_id FROM Items i
INNER JOIN Subitems si on i.item_id = si.item_id
ORDER BY i.item_id
但是,您通常会使用应用程序层进行打印。如果真的需要像你所显示的那样行,你可以用光标做一些事情,但如果你想要那个确切的输出,直接查询看起来会非常时髦。
查看http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_group-concat的MySQL
SQLite似乎支持类似的操作:http://www.sqlite.org/lang_aggfunc.html
答案 2 :(得分:0)
答案 3 :(得分:0)
感谢Parahat,我们有一个明确的答案:
SELECT i.name, GROUP_CONCAT(si.name) AS subitems
FROM items i
LEFT JOIN subitems si ON si.item_id = i.id
GROUP BY i.id
这样我们就拥有了一个无限的子项列表,它被全局变量group_concat_max_len截断。
但是有一种更好的方法可以将其限制为我问题的最初值10:
SELECT i.name,
SUBSTRING_INDEX(GROUP_CONCAT(si.name), ', ', 10) AS subitems
FROM items i
LEFT JOIN subitems si ON si.item_id = i.id
GROUP BY i.id
这只适用于MySQL。