【发布时间】:2019-10-27 16:54:36
【问题描述】:
我有一个记录人们高尔夫分数的数据库。每个人都有任意多的分数,因为高尔夫比赛没有硬性限制。
随着每个人和分数,日期(存储为 Unix 时间,但这里正常显示)和一些其他数据(如课程和天气)被记录。
我的问题如下: 1)我只想要每个玩家最古老的“最高”分数。这意味着如果一个球员的最好成绩是标准杆(不管球场如何)并且完成了 3 次,我只想要第一个。我的代码没有处理这个,我不知道该怎么做。它输出玩家最好成绩的所有实例。
2) 我还希望能够从数据的特定子集中获取数据。示例:FROM golfdata WHERE Course = $course_name 或天气条件等。我的解决方案让我这样做了两次。有没有办法不重复自己?
这是我能得到的最接近的:
SELECT a.*
FROM golfdata a
INNER JOIN (
SELECT Name, MIN(Score) Score
FROM golfdata b
GROUP BY Name) c
ON a.Name = c.Name AND a.Score = c.Score
如果我想按课程过滤,我使用:
(SELECT * FROM golfdata WHERE Course = $course_name) in place of "golfdata"
样本数据,实际情况更多。
+--------+------------+-------+-------------+------+
| Name | YYYY-MM-DD | Score | Location | Wind |
+--------+------------+-------+-------------+------+
| Tom | 2019-5-25 | 70 | Augusta | Fast |
| Amanda | 2019-1-13 | 73 | Augusta | Calm |
| David | 2018-12-25 | 69 | Pine Valley | Slow |
| David | 2018-9-15 | 72 | Oakmont | Calm |
| David | 2018-5-19 | 71 | Pine Valley | Slow |
| Tom | 2018-8-11 | 70 | Oakmont | Calm |
+--------+------------+-------+-------------+------+
预期输出:
+--------+------------+-------+-------------+------+
| Name | YYYY-MM-DD | Score | Location | Wind |
+--------+------------+-------+-------------+------+
| Amanda | 2019-1-13 | 73 | Augusta | Calm |
| David | 2018-12-25 | 69 | Pine Valley | Slow |
| Tom | 2018-8-11 | 70 | Oakmont | Calm |
+--------+------------+-------+-------------+------+
请注意,无论课程如何,都选择了汤姆最老的“最佳”分数。
更多信息:如果有帮助的话,我正在使用 MySQL v5.7。
【问题讨论】:
-
我会在这个实例中包含一个代理键
-
@Strawberry 我不太明白这是什么意思。
-
查看添加的标签。
标签: mysql optimization min groupwise-maximum