Mysql分组依据(结果的自定义编号)

Mysql分组依据(结果的自定义编号),mysql,group-by,Mysql,Group By,我有一张桌子 Id Name Id_collection Price 1 good1 2 10 2 good2 1 101 3 good3 3 102 4 good4 2 10 5 good5 2 10 我需要按id_集合进行分组,但我需要显示2行(以便能够通过变量或…更改此值,例如:更改为3或4) 或 所以结果一定是 Id Name

我有一张桌子

Id Name   Id_collection  Price
1  good1  2              10
2  good2  1              101
3  good3  3              102
4  good4  2              10
5  good5  2              10
我需要按id_集合进行分组,但我需要显示2行(以便能够通过变量或…更改此值,例如:更改为3或4)

所以结果一定是

Id Name   Id_collection  Price
1  good1  2              10
4  good4  2              10
2  good2  1              101
3  good3  3              102

我在考虑程序或循环,但我以前没有,请帮助

要按相邻值分组。在MySQL中。您可以使用变量来分配组。或者,您可以使用此方法来分配组:计算具有
id\u集合
的行数,这些行与具有较小id的每一行不同

您没有指定如何计算其他列,但这里有一个猜测:

select min(id) as id, min(name) as name, id_collection, avg(price) as price
from (select t.*,
             (select count(*)
              from t t2
              where t2.id_collection <> t.id_collection and
                    t2.id < t.id
             ) as grp
      from t
     ) t
group by id_collection, grp;

我编辑了一点@Gordon_Linoff发布的答案,现在它可以工作了,你只需更改rn@Gordon_Linoff第一个查询工作正常,第二个不正常(显示所有行),对于第一个查询,是否可以显示3个或更多数字而不仅仅是2?@Asylzazazaev。有几个输入错误。@Gordon_Linoff您的第一个示例非常好,但我不知道如何显示3或4个分组“id_collection”计数,现在它显示2个计数,但很快就会更改,第二个示例显示所有数据列表,字段“rn”始终保持为1,请帮助!!!
Id Name   Id_collection  Price
1  good1  2              10
4  good4  2              10
2  good2  1              101
3  good3  3              102
select min(id) as id, min(name) as name, id_collection, avg(price) as price
from (select t.*,
             (select count(*)
              from t t2
              where t2.id_collection <> t.id_collection and
                    t2.id < t.id
             ) as grp
      from t
     ) t
group by id_collection, grp;
select t.*
from (select t.*,
             (@rn := if(@id = id_collection, @rn,
                        if(@id := id_collection, @rn + 1, @rn + 1)
                       )
             ) as rn
      from t cross join
           (select @id = -1, @rn := 0) params
      order by id
     ) t
where rn = 1;
select t.*
from (select t.*,
             (@rn := if(@id = id_collection, @rn + 1,
                        if(@id := id_collection, 1, 0)
                       )
             ) as rn
      from t cross join
           (select @id := -1, @rn := 0) params
      order by id_collection
     ) t
where rn <= 3;