在数据库SQL中选择获奖女性

时间:2017-12-13 23:56:05

标签: mysql database querying

我想知道如何在我的数据库中检索获奖女性。 获胜的男女比赛是:

埃德雷诺兹男子41分钟

Erna Obrien女43分钟

可以使用

检索获胜的男人

MIN(performance_in_minutes)因为那样我将获得总冠军,这恰好是男人

但我如何找回获奖女性?我尝试了以下查询,但这不会起作用......

SELECT A.Fname, A.Sex, PI.Performance_in_minutes
from athlete as A LEFT OUTER JOIN participation_ind as PI on A.athleteID = PI.athleteID
WHERE eventID = 35
AND PI.Performance_in_minutes = 
    (SELECT MIN(PI.performance_in_minutes) FROM participation_ind PI WHERE PI.eventID = 35 AND A.Sex = 'F')

1 个答案:

答案 0 :(得分:0)

您的查询有两个问题。


您的子查询 尝试 ,以获得女性事件35的最短时间。不幸的是,如果您拥有A.sex = 'f',则您的内部查询在任何位置都没有A表。 (您还需要在子查询中的JOIN表中包含athlete。)

AND PI.Performance_in_minutes = (
        SELECT MIN(PI.performance_in_minutes)
          FROM participation_ind PI
    INNER JOIN athlete A ON A.athleteID = PI.athleteID
         WHERE PI.eventID = 35
           AND A.Sex = 'F'
    )

如果不这样做,您的子查询的WHERE子句将引用外部查询的A表。哪个没有完成任何事情。


然后,你还需要将外部查询过滤到女性...... (如果你没有和男性运动员碰巧与获胜的女运动员同时完成,那么男运动员也将被退回。)

SELECT
    A.Fname, A.Sex, PI.Performance_in_minutes
FROM
    athlete             A
INNER JOIN
    participation_ind   PI
        ON A.athleteID = PI.athleteID
WHERE
    PI.eventID = 35
    AND A.Sex = 'F'
    AND PI.Performance_in_minutes = (
           SELECT
               MIN(PI.performance_in_minutes)
           FROM
               athlete             A
           INNER JOIN
               participation_ind   PI
                   ON A.athleteID = PI.athleteID
           WHERE
               PI.eventID = 35
               AND A.Sex = 'F'
        )


如果您知道只有 一个 获胜者,这可以简化很多。但是子查询版本更好,因为它解释了两个或更多运动员并列第一名的罕见情况。


您还可以通过加入子查询来减少代码中的一些重复,而不是在WHERE子句中使用它。

SELECT
    A.Fname, A.Sex, PI.Performance_in_minutes
FROM
(
    SELECT
        PI.eventID,
        A.Sex,
        MIN(PI.performance_in_minutes)   AS performance_in_minutes
    FROM
        participation_ind   PI
    INNER JOIN
        athlete             A
            ON A.athleteID = PI.athleteID
    GROUP BY
        PI.eventID,
        A.Sex
)
    winning_times
INNER JOIN
    participation_ind   PI
        ON  PI.eventID                = winning_times.eventID
        AND PI.performance_in_minutes = winning_times.performance_in_minutes
INNER JOIN
    athlete             A
        ON  A.athleteID = PI.athleteID
        AND A.Sex       = winning_times.Sex
WHERE
        winning_times.eventID = 35
    AND winning_times.Sex     = 'F'

现在,您只需更改一个WHERE子句,而不是两个,就可以更改要分析的事件或性别。