我想知道应该如何检索数据库中的获奖女性。
比赛的优胜者是:

埃德·雷诺兹男子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')

最佳答案

您的查询有两个问题。



您的子查询尝试为女性获得事件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子句,而不是两个,就可以更改要分析的事件或性别。

关于mysql - 在数据库SQL中选择获胜的女性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47803903/

10-11 04:44