我在使用sql语句时遇到此问题。该表如下所示:


赛车手(比赛名称)
匹配项(matchid,racerid,timeInSeconds)


我的问题是,假设有一个名为“ Alex”的赛车手。是否有可能查询找到至少在这些比赛中的4次中击败“ Alex”的赛车手。 (意味着timeInSeconds较小)

我知道这似乎是一个非常简单的查询,但是我似乎无法解决这个问题,也似乎也无法为此寻求答案。 (可能是因为我真的不知道要搜索什么。)

提前致谢!!

最佳答案

因为Chris P一直在推动这一问题,所以这个答案是针对MySQL的,但是由于MySQL和SQL Server都被标记了,很难分辨您正在使用哪种技术。
一种方法是使用EXISTS作为过滤子查询

SELECT r.name
FROM racer r
JOIN matches m ON m.racerid = r.racerid
WHERE EXISTS (
    SELECT 1
    FROM racer r1
    JOIN matches m1 ON m1.racerid = r1.racerid
    WHERE r1.name = "Alex"
      AND m.timeinseconds < m1.timeinseconds
)
GROUP BY r.racerid
HAVING COUNT(*) >= 4


MySQL DEMO

作为奖励,如果您希望查看击败alex的人花费的平均时间(以秒为单位),则可以将AVG(m.timeinseconds)添加到选择中...如果要查看所有时间,则可以执行GROUP_CONCAT(m.timeinseconds)查看以逗号分隔的时间列表



编辑:

如果您想要sql server的答案,可以按照注释中的chris p的说明更改组。。注意Alex周围的引号必须为单引号

SELECT r.name
FROM racer r
JOIN matches m ON m.racerid = r.racerid
WHERE EXISTS (
    SELECT 1
    FROM racer r1
    JOIN matches m1 ON m1.racerid = r1.racerid
    WHERE r1.name = 'Alex'
      AND m.timeinseconds < m1.timeinseconds
)
GROUP BY r.name
HAVING COUNT(*) >= 4


SQL SERVER DEMO

09-06 07:57