我想知道应该如何检索数据库中的获奖女性。
比赛的优胜者是:
埃德·雷诺兹男子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/