如何使用一个查询获取包含子列表的列表?

时间:2012-07-02 21:15:43

标签: mysql sql sqlite

我想从数据库表中打印一个项目列表,并与每个项目一起列出一个相关子项目的小列表(最多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中完成?这甚至可能吗?

4 个答案:

答案 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)

您需要使用group by子句:

你需要

select * from tblsubitems
          group by(item_id);

sqlitemysql

的详细信息

答案 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。