2

我想打印一个数据库表中的项目列表,以及每个项目的相关子项目的小列表(最多 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

4 回答 4

6

如果是 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
于 2012-07-02T21:24:28.027 回答
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

不过,您通常会使用应用程序层进行打印。如果你真的需要像你展示的那样的行,你可以用游标做一些事情,但是如果你想要那个精确的输出,直接查询会看起来很时髦。

查看MySQL的http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_group-concat

SQLite 似乎支持类似的操作: http ://www.sqlite.org/lang_aggfunc.html

于 2012-07-02T21:20:59.497 回答
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。

于 2012-07-02T21:59:11.877 回答
-1

您需要使用 group by 子句:

你需要

select * from tblsubitems
          group by(item_id);

有关sqlitemysql的更多信息

于 2012-07-02T21:23:14.483 回答