我必须将表1称为“ athelete”,将表2称为“ training_session”。第一个表包含ID,姓名,电子邮件等,第二个表包含活动以及他们接受培训的时间。
运动员桌
培训课程表
我想检索步行最快的运动员的数据,并检索他/她的ID,速度,姓名和俱乐部代码,但我不知道如何完成此任务。
SELECT *
FROM (
SELECT
a.id,
a.name,
a.club_code,
t.distance / t.duration speed,
ROW_NUMBER() OVER(ORDER BY t.distance / t.duration DESC) rn
FROM
athlete a
INNER JOIN training_session t ON a.id = t.athelete_id
WHERE t.activity = 'Walking'
) x
WHERE rn = 1
最佳答案
在MySQL 8.0n中,您可以在子查询中使用窗口函数ROW_NUMBER()
通过降低速度来对步行训练课程进行排名,并根据外部查询中最快的课程进行过滤。
SELECT *
FROM (
SELECT
a.id,
a.name,
a.club_code,
t.distance / t.duration speed,
ROW_NUMBER() OVER(ORDER BY t.distance / t.duration DESC) rn
FROM
athlete a
INNER JOIN training_session t ON a.id = t.athlete_id
WHERE t.activity = 'Walking'
) x
WHERE rn = 1
在早期版本中,可以将
NOT EXISTS
条件与相关子查询一起使用,以确保没有比当前会话更快的步行会话:SELECT
a.id,
a.name,
a.club_code,
t.distance / t.duration speed,
FROM
athlete a
INNER JOIN training_session t ON a.id = t.athlete_id
WHERE
t.activity = 'Walking'
AND NOT EXISTS (
SELECT 1
FROM training_session t1
WHERE
t1.distance / t1.duration > t.distance / t.duration
AND t1.activity = 'Walking'
)