在mySQL中,如何返回仅限于特定数量的组+唯一项的分组项列表

时间:2010-03-23 14:14:21

标签: sql 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组,每个项目无空计为一个唯一组 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组,并计为一个返回组,使我们的总数返回到4组。项目7,9,10和11都是第21组,并计为一个返回组,使我们的总数达到5个返回组,此时不再返回组或单个项目(计为组)。

我通常对SQL非常好,但这个完全不适合我。

谢谢大家!!!

1 个答案:

答案 0 :(得分:0)

这将返回您要求的内容。内部子查询只是过滤空值并分配唯一的“密钥”(负的ID号)。这些“限制”到前五个唯一的组ID,然后与子查询的副本连接以返回我们需要的记录。然后使用外部子查询以reuquested的方式打印结果集。

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;