【问题标题】:Find single row from each group in GROUP BY clause in MySQL在 MySQL 的 GROUP BY 子句中从每个组中查找单行
【发布时间】:2021-07-14 05:21:48
【问题描述】:

我有一个带有子查询 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 的方法,但似乎无法使其正常工作。

【问题讨论】:

    标签: mysql group-by subquery


    【解决方案1】:

    这是一个连接方法:

    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;
    

    【讨论】:

    • 你的意思是这里的子查询是yourTable吗?该查询很大,如果可能的话,我想避免再次复制它
    • 这是回答 MySQL 5.7 问题的最佳方法之一。我不知道我还能说什么。
    • 如果在不复制子查询的情况下没有其他方法可以做到这一点,那么这将是我最后的手段。谢谢!
    【解决方案2】:

    你可以按技能组名和级别名分组,然后选择max(level_value)就可以了

    【讨论】:

    • 嘿,谢谢;但它似乎没有工作。它返回所有行。我试过这个: SELECT Skillset_name, MAX(level_value) FROM (SELECT ....) q1 WHERE met=1 GROUP BY Skillset_name, level_name
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2020-01-22
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多