Mysql 使用带有GROUP BY和INNER JOIN的MIN()函数删除重复行

Mysql 使用带有GROUP BY和INNER JOIN的MIN()函数删除重复行,mysql,Mysql,在加入“运动员表”时,我试图在“结果表”中列出每个人的唯一/不同的MINtime,但我得到了重复的MINtime 下面是我正在运行的MySql 5.7的一些示例数据 结果表 +-----+------+-----+-----+----+-------+------+ |结果|运动员ID |事件ID |年龄组|时间|地点|日期| +-----+------+-----+-----+----+-------+------+ |1 | 10 | 1 | MS | 10.20 |东京| 06-06-20

在加入“运动员表”时,我试图在“结果表”中列出每个人的唯一/不同的MINtime,但我得到了重复的MINtime

下面是我正在运行的MySql 5.7的一些示例数据

结果表 +-----+------+-----+-----+----+-------+------+ |结果|运动员ID |事件ID |年龄组|时间|地点|日期| +-----+------+-----+-----+----+-------+------+ |1 | 10 | 1 | MS | 10.20 |东京| 06-06-2019| |2 | 11 | 1 | MS | 10.24 |伦敦| 03-08-2019| |3 | 10 | 1 | MS | 10.20 |洛杉矶| 01-11-2019| |4 | 13 | 1 | MS | 10.29 |格拉斯哥| 28-10-2019| |5 | 14 | 1 | MS | 10.32 |奥斯陆| 16-07-2019| | ... | ... | ... | ... | ... | ... | ... | | ... | ... | ... | ... | ... | ... | ... | +-----+------+-----+-----+----+-------+------+

运动员桌 +------+------+-----+----+-------+ |运动员ID |姓名第一|姓名最后|性别|出生日期| +------+------+-----+----+-------+ |10 |比尔|史密斯| MS | 10-11-2000| |11 |约翰|布朗|女士| 1-08-1999| |12 |史蒂夫|琼斯| MS | 16-01-1997| |13 |艾伦|格林| MS | 21-07-2001| |14 |保罗|布莱克| MS | 27-10-2000| | ... | ... | ... | ... | ... | | ... | ... | ... | ... | ... | +------+------+-----+----+-------+

我已经尝试了以下代码-它似乎带来了正确的结果集,但返回重复的值。比尔·史密斯跑了两次10.20,但我只需要展示其中一个

我曾尝试在两个SELECT上使用DISTINCT函数,但运气不佳-因此我有:

挑选* 根据结果 内连接 选择athleteID、nameFirst、nameLast、MINtime作为MINtime 根据结果 运动员使用田径内接 其中eventID='1' 和“MS”中的年龄组 和YEARresults.date='2019' 按athleteID分组 作为results.athleteID=child.athleteID和results.time=minTime上的子对象 拥有YEARresults.date='2019' 由minTime ASC订购

我得到这个结果 +----+------+-----+-------+------+ |时间|第一名|最后一名|地点|日期| +----+------+-----+-------+------+ |10.20 |比尔|史密斯|东京| 2019年6月6日| |10.20 |比尔|史密斯|洛杉矶| 01-11-2019| |10.24 |约翰|布朗|伦敦| 03-08-2019| |10.29 |史蒂夫|琼斯|格拉斯哥| 28-10-2019| |10.32 |艾伦|格林|奥斯陆| 16-07-2019| | ... | ... | ... | ... | ... | | ... | ... | ... | ... | ... | +----+------+-----+-------+------+ 正如你所看到的,比尔·史密斯10.20的附加成绩——洛杉矶也出现了。我需要这个被省略,只显示每个运动员一个结果-如下

期望结果 +----+------+-----+-----+------+ |时间|第一名|最后一名|地点|日期| +----+------+-----+-----+------+ |10.20 |比尔|史密斯|东京| 2019年6月6日| |10.24 |约翰|布朗|伦敦| 03-08-2019| |10.29 |史蒂夫|琼斯|格拉斯哥| 28-10-2019| |10.32 |艾伦|格林|奥斯陆| 16-07-2019| +----+------+-----+-----+------+

关于我可以尝试什么,有什么建议吗


非常感谢。

您的运动员具有相同的最小时间。在这种情况下,您还需要在外部选择中输入最小日期

SELECT  r.athleteID, r.nameFirst, r.nameLast, min(r.date), child.minTime
FROM results r
INNER JOIN (
    SELECT athleteID, nameFirst, nameLast
      , MIN(time) as minTime
    FROM results
    INNER JOIN athletes USING(athleteID)
    WHERE eventID = '1'
    AND ageGroup IN('MS')
    AND YEAR(results.date) = '2019'
    GROUP BY athleteID
) AS child ON (r.athleteID = child.athleteID) AND (r.time = minTime)
WHERE YEAR(r.date) = '2019'
GROUP BY r.athleteID, child.minTime
ORDER BY minTime ASC

您与GROUP BY athleteID的内部选择将返回每个运动员一行。您与结果表的内部联接有一个条件results.time=minTime,它将处理重复项,除非运动员有多个具有相同minTime值的事件,这与Bill Smith的情况类似,他有两个时间为10.20的事件。在这种情况下,您如何决定返回哪一行?希望返回日期最早的行,如果它们相同,即2019年6月6日超过2019年11月1日,即2019年6月6日超过2019年11月1日,这看起来非常有希望!-我们将做进一步的测试。很快就回来,我想你已经搞定了。给出你的答案。非常感谢!