首页 > 解决方案 > 在 MySQL 的 GROUP BY 子句中从每个组中查找单行

问题描述

我有一个带有子查询 q1 的查询

SELECT skillset_name, level_name, level_value
FROM 
(SELECT ...) q1
WHERE met=1

它返回以下内容:

+------------------+------------+-------------+
| skillset_name    | level_name | level_value |
+------------------+------------+-------------+
| Python Fullstack | L1         |           1 |
| PHP Fullstack    | L2         |           2 |
| Java Fullstack   | L0         |           0 |
| Python Backend   | L1         |           1 |
| PHP Backend      | L2         |           2 |
| PHP Fullstack    | L1         |           1 |
| Python Fullstack | L2         |           2 |
| PHP Backend      | L1         |           1 |
| Python Backend   | L2         |           2 |
+------------------+------------+-------------+

现在我需要以这样的方式过滤掉它,只返回每个技能组名称的最大级别,也就是说,我只需要这个:

+------------------+------------+-------------+
| skillset_name    | level_name | level_value |
+------------------+------------+-------------+
| PHP Fullstack    | L2         |           2 |
| Java Fullstack   | L0         |           0 |
| PHP Backend      | L2         |           2 |
| Python Fullstack | L2         |           2 |
| Python Backend   | L2         |           2 |
+------------------+------------+-------------+
 

我怎样才能在 MySQL (5.7) 中得到它?我尝试了多种使用 GROUP BY 的方法,但似乎无法让它以正确的方式工作。

标签: mysqlgroup-bysubquery

解决方案


这是一个连接方法:

SELECT t1.skillset_name, t1.level_name, t1.level_value
FROM yourTable t1
INNER JOIN
(
    SELECT skillset_name, MAX(level_value) AS max_level_value
    FROM yourTable
    GROUP BY skillset_name
) t2
    ON t2.skillset_name = t1.skillset_name AND
       t2.max_level_value = t1.level_value;

推荐阅读