Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mySQL中,如何返回限制为一定数量的组+唯一项的分组项列表_Sql_Mysql - Fatal编程技术网

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

在mySQL中,如何返回限制为一定数量的组+唯一项的分组项列表,sql,mysql,Sql,Mysql,好吧,这可能很难,但我会尽力解释。请容忍我 我有一个包含多列的表,如下所示 项目标识-组标识 1-空 2-空 3-空 4 - 3 5 - 3 6 - 3 7 - 21 8 - 6 9 - 21 10 - 21 11 - 21 12 - 4 13

好吧,这可能很难,但我会尽力解释。请容忍我

我有一个包含多列的表,如下所示

项目标识-组标识 1-空 2-空 3-空 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

我想进入此表并返回一个列表,以便:

一,。每一项都是独立的。 2.每个项目都按组ID分组。 3.结果限制为总共5个组,每个为空的项被计算为单个唯一组。 4.返回组时,将返回具有相同组号的所有对象

在这个例子中,我想返回:

1-空 2-空 3-空 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很在行,但这一点我完全无法理解


谢谢大家

这将返回您要求的内容。内部子查询只是过滤空值并为唯一键分配一个负id号。这些ID仅限于前五个唯一的组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;

好的,我会继续研究这个问题,可能会有一些有用的东西。下面的代码将正确返回row_计数器变量,同时按照我的要求对其进行排序。设置@count:=0,@group:=;从myTable ORDER BY GROUP_ID中选择ITEM_ID、GROUP_ID、@count:=如果@GROUP not like GROUP_ID或GROUP_ID like或GROUP_ID为null、@count+1、@count AS row_counter、@GROUP:=GROUP_ID AS dummy这将正确获取组计数,但在变量row_计数器达到5时无法停止。我试着使用“WHERE row_counter”好吧,我很抱歉,不知道为什么格式不正确,似乎不想让我格式化它…哦,如果可以避免的话,我不想使用临时表。查询通常可能返回数千个结果,并且经常运行。我想让它只运行在它需要运行的东西上。再次感谢!您按什么顺序将分组限制为5个?从这个例子来看,它看起来像是先为空,然后升序为group_id.Dan,谢谢你的提问。我确实是按组id排序的,空值排在第一位。每个空值将使计数器递增。之前未计数的每个组id也将增加计数器。一旦计数器达到5,我希望查询停止。我知道我可以使用嵌套的select,但内部表可能会非常大,从而使我的查询速度非常慢。谢谢,我花了一分钟时间才看到你在做什么,但一旦我意识到我可以踢自己:非常感谢你的帮助!