Php 使用GROUP BY中的LIMIT可获得每个动态组的N个结果

Php 使用GROUP BY中的LIMIT可获得每个动态组的N个结果,php,mysql,database,subquery,dynamic-queries,Php,Mysql,Database,Subquery,Dynamic Queries,使用GROUP BY中的LIMIT可获得每个动态组的N个结果 大家好,首先我读到了关于这个问题的问题。 但是没有得到解决方案。所有这些SQL都是为静态列设计的。 但我有动态列 表: id Name Group Level 2 Jonathan A 5 5 David A 10 6 Alex C 10 7 Kemal A 71 8 John D 21 9 Celin F

使用GROUP BY中的LIMIT可获得每个动态组的N个结果

大家好,首先我读到了关于这个问题的问题。 但是没有得到解决方案。所有这些SQL都是为静态列设计的。 但我有动态列

表:

id  Name      Group Level 
2   Jonathan  A     5 
5   David     A     10
6   Alex      C     10
7   Kemal     A     71
8   John      D     21
9   Celin     F     100
12  Alexis    G     15
13  Noone     A     23
我想从每组中获得前两个最高级别

但查询必须是动态的,因为将有更多的组,这正是我遇到的问题

我尝试过的解决方案:

没有给出真正的结果,它坏了。
您还可以进行变通

选择最多2行的列

从表中按组级别降序排序

问候,


Umar Abdullah

您使用的是什么版本的MySQL?为什么您当前的查询不能满足您的期望?@TimBiegeleisen MySQL版本:5.6.33也解决了我的问题!对在MySQL 8+中,有一种更好的方法可以做到这一点,而上述方法在将来的某个时候将不适用。@TimBiegeleisen公平地说,在将来的某个时候,我们将使用心灵感应来解决这类问题。@草莓让我们认为还有一个专栏适合你的类型。有些行有Suit_A,有些行有Suit_B。但我想在这个查询中将它们作为一个。按西装类型分组。我是说Kemal-A-71-Suit_A-Kemal-A-70-Suit_B-Noone-A-69-Suit_A。当查询工作时,我不想选择两者,因为它们的名称是相同的。只是西装不同,但没关系。我只想先选择。我想要这个结果->凯末尔-A-71-Suit_A和Noone-A-69-Suit_A。我应该在哪里写这个?非常感谢。@Siberhecy评论部分不适合进行此类讨论。如果您有一个新问题,请提出一个引用此问题的新问题,如果合适,此查询将按级别而不是按每组排序。
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,name VARCHAR(12) NOT NULL
,group_name CHAR(1) NOT NULL
,level INT NOT NULL
);

INSERT INTO my_table VALUES
( 2,'Jonathan','A',5),
( 5,'David','A',10),
( 6,'Alex','C',10),
( 7,'Kemal','A',71),
( 8,'John','D',21),
( 9,'Celin','F',100),
(12,'Alexis','G',15),
(13,'Noone','A',23);

SELECT id
     , name
     , group_name
     , level 
  FROM 
     ( SELECT x.*
            , CASE WHEN @prev = group_name THEN @i:=@i+1 ELSE @i:=1 END i
            , @prev:=group_name 
         FROM my_table x -- technically, ordering should really happen here, in a separate subquery
            , ( SELECT @prev:=null,@i:=0 ) vars 
        ORDER 
           BY group_name
            , level DESC
            , id
     ) a 
 WHERE i <=2;
+----+--------+------------+-------+
| id | name   | group_name | level |
+----+--------+------------+-------+
|  7 | Kemal  | A          |    71 |
| 13 | Noone  | A          |    23 |
|  6 | Alex   | C          |    10 |
|  8 | John   | D          |    21 |
|  9 | Celin  | F          |   100 |
| 12 | Alexis | G          |    15 |
+----+--------+------------+-------+