从 MySQL 数据库中按最低分数获取行
Fetching Rows By Minimum Scores From MySQL Database
我有一个数据库,可以按人记录高尔夫得分。每个人都有任意多的分数,因为高尔夫比赛没有硬性限制。
与每个人和分数一起,日期(存储为 Unix 时间但此处正常显示)和一些其他数据(如课程和天气)被记录。
我的问题如下:
1) 我只想要每个玩家最老的 "top" 分数。这意味着如果一名球员的最好成绩是 Par(无论球场如何)并且完成了 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 |
+--------+------------+-------+-------------+------+
请注意,Tom 最老的 "best" 乐谱被选中,无论如何。
更多信息:如果有帮助的话,我正在使用 MySQL v5.7。
也许是这样的:
SELECT a.name,MIN(a.date) DATE,c.Score,a.Location,a.Wind
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
GROUP BY a.NAME,c.score;
我在 select 中添加了 MIN(a.date) DATE
基本上是为了在分数相同时获得最小的日期。然后我在外部查询中添加了 GROUP BY a.NAME, c.score
。
我有一个数据库,可以按人记录高尔夫得分。每个人都有任意多的分数,因为高尔夫比赛没有硬性限制。
与每个人和分数一起,日期(存储为 Unix 时间但此处正常显示)和一些其他数据(如课程和天气)被记录。
我的问题如下: 1) 我只想要每个玩家最老的 "top" 分数。这意味着如果一名球员的最好成绩是 Par(无论球场如何)并且完成了 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 |
+--------+------------+-------+-------------+------+
请注意,Tom 最老的 "best" 乐谱被选中,无论如何。
更多信息:如果有帮助的话,我正在使用 MySQL v5.7。
也许是这样的:
SELECT a.name,MIN(a.date) DATE,c.Score,a.Location,a.Wind
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
GROUP BY a.NAME,c.score;
我在 select 中添加了 MIN(a.date) DATE
基本上是为了在分数相同时获得最小的日期。然后我在外部查询中添加了 GROUP BY a.NAME, c.score
。