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

时间:2019-06-13 06:40:30

标签: mysql optimization min groupwise-maximum

我有一个数据库,可以记录人们的高尔夫得分。每个人都有许多得分,因为高尔夫比赛没有硬性限制。

记录每个人和每个分数,记录日期(以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。

1 个答案:

答案 0 :(得分:0)

也许是这样的:

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