2

データベーステーブルからアイテムのリストを印刷し、それぞれと一緒に、関連するサブアイテムの小さなリスト(最大10アイテム)を印刷したいと思います。

たとえば、次の2つのテーブルがあります。

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

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 に答える
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 に答える
-1

groupby句を使用する必要があります。

あなたが必要になるだろう

select * from tblsubitems
          group by(item_id);

sqlitemysqlの詳細

于 2012-07-02T21:23:14.483 に答える