我在使用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