1


0

mySQLで、特定のグループ数+一意のアイテムに制限されたグループ化されたアイテムのリストを返す方法

さて、これは難しいかもしれませんが、説明するために最善を尽くします。 私と一緒に…​

次のように複数の列を持つテーブルがあります。

ITEM_ID-GROUP_ID + 1-null + 2-null + 3-null + 4-3 + 5-3 + 6-3 + 7-21 + 8-6 + 9-21 + 10-21 + 11-21 + 12- 4 + 13-4 + 15-6 + 16-6 + 17-6 + 19-3

私はこの表に行き、次のようなリストを返したいです:

1.)各アイテムは別々です。 + 2.)各アイテムはグループIDでグループ化されます。 + 3.)結果は合計で5つのグループに制限され、各アイテムは単一の一意のグループとしてnullカウントされます。 + 4.)グループが返されると、同じグループ番号を持つすべてのオブジェクトが返されます。

この例では、私は戻りたい:

1-null + 2-null + 3-null + 4-3 + 5-3 + 6-3 + 19-3 + 7-21 + 9-21 + 10-21 + 11-21

したがって、アイテム1、2、および3は、それぞれ1つの返品グループとしてカウントされ、合計3つの返品グループになります。 アイテム4、5、6、および19はすべてグループ3であり、1つの返されたグループとしてカウントされ、合計4つのグループが返されます。 アイテム7、9、10、および11はすべてグループ21であり、1つの返されたグループとしてカウントされ、合計で5つの返されたグループになります。

私は通常SQLにはかなり長けていますが、これは完全に私を避けます。

みんな、ありがとう!!!

1 Answer


0


これは、あなたが求めているものを返します。 内側のサブクエリは、単にヌルをフィルタリングし、一意の「キー」(負のID番号)を割り当てます。 これらは、最初の5つの一意のグループIDに「制限」され、その後、必要なレコードを返すためにサブクエリのコピーに対して結合されます。 次に、外側のサブクエリを使用して、要求された方法で結果セットを出力します。

select a.item_id, case when a.group_id <= 0 then null else a.group_id end group_id
from (
    select distinct group_id, item_id from test.so_test where group_id is not null
    union
    (select  -item_id, item_id from test.so_test where group_id is null)
)  a inner join (
    select distinct group_id from test.so_test where group_id is not null
    union
    (select  -item_id from test.so_test where group_id is null)
    order by group_id limit 0, 5
) b on a.group_id = b.group_id
order by case when a.group_id <= 0 then null else a.group_id end, a.item_id;