【问题标题】:Using LIMIT within GROUP BY to get N results per dynamic group在 GROUP BY 中使用 LIMIT 以获得每个动态组的 N 个结果
【发布时间】:2019-04-21 17:39:30
【问题描述】:

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 个最高的Level

但查询必须是动态的,因为会有更多的组,这是我卡住的地方。

我尝试过的解决方案:

  1. Select the top N rows from each group 不给出真实结果就坏了。
  2. Only work in static columns.

【问题讨论】:

标签: php mysql database subquery dynamic-queries


【解决方案1】:
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 |
+----+--------+------------+-------+

【讨论】:

  • 在 MySQL 8+ 中有一个更好的方法可以做到这一点,而上述方法在将来的某个时候将不再适用。
  • @TimBiegeleisen 公平地说,在未来的某个时候,我们将使用心灵感应来解决这类问题。
  • @Strawberry 让我们认为还有一列是“Suit_Type”。有些行有 Suit_A,有些行有 Suit_B。但我想把它们算作这个查询中的一个。喜欢 GROUP By Suit_Type。我的意思是“Kemal - A - 71 - Suit_A” - “Kemal - A - 70 - Suit_B” - “Noone - A - 69 - Suit_A”乙>。当查询工作时,我不想同时选择两者,因为它们名称相同。只有西装不同,但没关系。我只想先选择。我想要这个结果 -> “Kemal - A - 71 - Suit_A”“Noone - A - 69 - Suit_A”。我应该在哪里写这个?非常感谢。
  • @Siberhecy cmets 部分不适合进行此类讨论。如果您有新问题,请提出新问题(如果合适,请参考此问题)
【解决方案2】:

您也可以解决问题。

选择最多 2 行的列

按组级别降序排列

问候,

奥马尔·阿卜杜拉

【讨论】:

  • 此查询按级别排序所有内容,而不是按每个组排序。
猜你喜欢
  • 2011-01-08
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
相关资源
最近更新 更多