从 MySQL 数据库中按最低分数获取行

Posted

技术标签:

【中文标题】从 MySQL 数据库中按最低分数获取行【英文标题】:Fetching Rows By Minimum Scores From MySQL Database 【发布时间】: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 我不太明白这是什么意思。 查看添加的标签。 【参考方案1】:

大概是这样的:

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;

我在选择中添加了MIN(a.date) DATE,基本上是为了在分数相同时获得最小的日期。然后我在外部查询中添加了GROUP BY a.NAME, c.score

【讨论】:

不保证从a (a.name, a.location, a.wind) 返回的其他列将与最小a.date 所在的行来自同一行从返回。此查询依赖于 GROUP BY 行为的 MySQL 扩展,并且当通过在 mysql_mode 中包含 ONLY_FULL_GROUP_BY 禁用该扩展时将引发错误。 dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

以上是关于从 MySQL 数据库中按最低分数获取行的主要内容,如果未能解决你的问题,请参考以下文章

从 grep 输出中按索引获取行

从 Postcode DB 获取 lat/lng 并在 PHP/MYSQL 中按最近的顺序排序

在 MySQL 中按多列获取重复行

从使用 PHP 的 MySQL 数据库到 iPhone 的分数列表中获取排名

在 MySQL 5.7 中获取最高分数和最高分数行中的字段 [重复]

在 Laravel 5 中按行排序并限制结果