我有一个表,用户可以在其中存储分数和有关该分数的其他信息(例如,分数注释或花费的时间等).我想要一个mysql查询,该查询可找到每个用户的个人最佳成绩及其相关的注释和时间等
我尝试使用的是这样的:
SELECT *,MAX(score)FROM table GROUP BY(用户)
这样做的问题是,虽然您可以从查询[MAX(score)]中获得最大的个人收益,但返回的音符和时间等与最高分数无关,而是与最高分数不同(特别是*中包含的分数) .有什么办法可以编写查询来选择我想要的内容?还是我必须在PhP中手动进行?
解决方法:
您可以与子查询联接,如以下示例所示:
SELECT t.*,
sub_t.max_score
FROM table t
JOIN (SELECT MAX(score) as max_score,
user
FROM table
GROUP BY user) sub_t ON (sub_t.user = t.user AND
sub_t.max_score = t.score);
上面的查询可以解释如下.它开始于:
SELECT t.* FROM table t;
…这本身显然会列出表的所有内容.目标是仅保留代表特定用户最高分数的行.因此,如果我们有以下数据:
+------------------------+
| user | score | notes |
+------+-------+---------+
| 1 | 10 | note a |
| 1 | 15 | note b |
| 1 | 20 | note c |
| 2 | 8 | note d |
| 2 | 12 | note e |
| 2 | 5 | note f |
+------+-------+---------+
…我们只希望保留“ note c”和“ note e”行.
要找到我们要保留的行,我们可以简单地使用:
SELECT MAX(score), user FROM table GROUP BY user;
请注意,我们无法从上述查询中获取notes属性,因为正如您已经注意到的那样,对于未与aggregate function聚合的字段(如MAX()或不属于GROUP BY子句的字段),您将无法获得预期的结果.有关此主题的更多信息,您可能需要检查:
现在,我们只需要保留第一个查询中与第二个查询匹配的行.我们可以使用INNER JOIN来做到这一点:
...
JOIN (SELECT MAX(score) as max_score,
user
FROM table
GROUP BY user) sub_t ON (sub_t.user = t.user AND
sub_t.max_score = t.score);
子查询的名称为sub_t.它是拥有最高个人得分的所有用户的集合. JOIN的ON子句将限制应用于相关字段.请记住,我们只想保留属于此子查询的行.
标签:max,grouping,mysql
来源: https://codeday.me/bug/20191106/2000623.html