我必须将表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'
    )

10-01 18:03