拉取具有组中特定列最大值的mysql行[重复]

Posted

技术标签:

【中文标题】拉取具有组中特定列最大值的mysql行[重复]【英文标题】:Pull mysql rows with max value of specific column in group [duplicate] 【发布时间】:2017-04-13 02:01:59 【问题描述】:

我有两张表,如下图:

            Table Name : scores
+-------+-----------+--------------+-----------+
| UNID  |   name    |    score     |   PRID    |
+-------+-----------+--------------+-----------+
|  1    |  name_1   |      93      |        1  |
|  2    |  name_2   |      71      |        1  |
|  3    |  name_3   |      53      |        2  |
|  4    |  name_4   |      82      |        2  |
|  5    |  name_5   |      31      |        2  |
|  6    |  name_6   |      68      |        3  |
+-------+-----------+--------------+-----------+

                  Table Name : user_dir
+-------+-----------+--------------+-----------+
| PRID  |   fname   |    city      |   gender  |
+-------+-----------+--------------+-----------+
|  1    |  fname1   |      XX      |        m  |
|  2    |  fname2   |      YY      |        f  |
|  3    |  fname3   |      ZZ      |        f  |
+-------+-----------+--------------+-----------+

对于来自 user_dir 的任何给定 PRID,我如何获取对应于该 score 最高值的整行>PRID

例如,对于 PRID 为 2 的用户“fname2”,我想提取整行(而不仅仅是 score 的值),如下所示:

 +-------+-----------+--------------+-----------+
 | UNID  |   name    |    score     |   PRID    |
 +-------+-----------+--------------+-----------+
 |  4    |  name_4   |      82      |        2  |

我使用该行的“max”函数进行了尝试,但它却给了我使用该 PRID 找到的第一行,以及正确的(最大)得分值,如下所示:

 +-------+-----------+--------------+-----------+
 | UNID  |   name    |    score     |   PRID    |
 +-------+-----------+--------------+-----------+
 |  3    |  name_3   |      82      |        2  |

编辑:我误解了我的要求,最终结果需要有最高分对应的“名称”值,而不是最高分本身。

所以实际的最终结果是:

+-------+-----------+--------------+-----------+
| PRID  |   name    |    fname     |   score   |
+-------+-----------+--------------+-----------+
|  1    |  fname1   |    name_1    |     93    |
|  2    |  fname2   |    name_4    |     82    |
|  3    |  fname3   |    name_6    |     68    |

【问题讨论】:

这个问题已经在 Stack Overflow 上被回答了数百次。我选择了最古老、投票率最高的答案之一,并投票决定将其作为重复答案关闭。如果您不喜欢那个,请单击我添加的标签并找到许多其他答案之一。 @BillKarwin 您链接到的副本是针对 Oracle 的。它在 mysql 中不起作用。 另见dev.mysql.com/doc/refman/5.7/en/… 【参考方案1】:
SELECT s.*
FROM scores s
WHERE PRID = 2 AND score = (SELECT MAX(score) FROM scores WHERE PRID = 2)

如果您想获取包含每个PRID 的所有最高分数的记录,那么您可以尝试以下操作:

SELECT s.*
FROM scores s
WHERE score = (SELECT MAX(score) FROM scores s1 WHERE s.PRID = s1.PRID)

【讨论】:

以上是关于拉取具有组中特定列最大值的mysql行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL根据列中的最大值获取行[重复]

mysql - 为每组分组的 SQL 结果获取具有最大值的记录[重复]

具有不同和最大值的MYSQL查询

从Oracle SQL中的每个组中选择具有最大值的行[重复]

使用多个重复的最大日期时间检索每个组中的最大日期时间记录 - MySQL 问答

Excel—分组然后取每组中对应时间列值最大的或者最小的