【发布时间】:2019-02-15 13:28:13
【问题描述】:
类似于this question,我在 MySQL 8.0.15 中有下表:
CREATE TABLE golf_scores (id INT PRIMARY KEY AUTO_INCREMENT, person TEXT, score INT, age INT);
INSERT INTO golf_scores (person, score, age) VALUES ('Angela', 40, 25),('Angela', 45, 25),('Angela', 55, 25),('Peter',45, 32),('Peter',55,32),('Rachel', 65, 35),('Rachel',75,35),('Jeff',75, 16);
SELECT * FROM golf_scores;
+----+--------+-------+------+
| id | person | score | age |
+----+--------+-------+------+
| 1 | Angela | 40 | 25 |
| 2 | Angela | 45 | 25 |
| 3 | Angela | 55 | 25 |
| 4 | Peter | 45 | 32 |
| 5 | Peter | 55 | 32 |
| 6 | Rachel | 65 | 35 |
| 7 | Rachel | 75 | 35 |
| 8 | Jeff | 75 | 16 |
+----+--------+-------+------+
我们要选择以下“最佳”3 行:
+----+--------+-------+------+
| id | person | score | age |
+----+--------+-------+------+
| 1 | Angela | 40 | 25 |
| 4 | Peter | 45 | 32 |
| 6 | Rachel | 65 | 35 |
+----+--------+-------+------+
换句话说,没有重复的最低 3 个高尔夫分数,以及该行的其他列。我不担心关系;我仍然想要三个结果。
查询 SELECT person, MIN(score) as min_score FROM golf_scores GROUP BY person ORDER BY min_score LIMIT 3; 提供正确的行,但仅限于列 person 和 score`。当我尝试这样修改它时:
SELECT id, person, MIN(score) as min_score, age FROM golf_scores GROUP BY person ORDER BY min_score LIMIT 3;
我收到此错误:
错误 1055 (42000):SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列“records.golf_scores.id”,它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容
我也尝试使用 SELECT id, DISTINCT person, score, age FROM golf_scores ORDER BY score LIMIT 3 消除重复名称,但出现错误
ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“DISTINCT person, score FROM golf_scores ORDER BY score LIMIT 3”附近使用正确的语法
如何在 MySQL 中获得所需的输出?
【问题讨论】:
-
避免在 cmets 中回答问题。
-
MySQL 8 版有窗口函数!
-
为什么一个人的年龄会存储在分数旁边?
-
为什么不用 person_id 而不是人名。
-
@SalmanA,这是一个 MWE,旨在代表一个真实的应用程序,我没有尽最大努力减少。也许像
temperature这样的专栏会更好,因为这是高尔夫球场的一个特点,而不是人。无论哪种方式,它只是一个表,我们希望返回其中的所有行。不过,感谢您指出这一点!
标签: mysql sql group-by distinct mysql-8.0