用于此问题的数据库的结构如下,主键加粗,外键和#39; &#39 ;.
国家/地区(名称, Country_ID ,area_sqkm,人口)
团队( team_id ,姓名,' country_id',说明,经理)
阶段( stage_id ,take_place,start_loc,end_loc,距离,说明)
Riders( rider_id ,名称,' team_id',year_born,height_cms,weight_kgs,' country_id',bmi)
结果(' stage_id ',' rider_id ',time_seconds)
我对以下问题感到困惑:
问:Bradley Wiggins赢得了巡回赛。写一个查询,找到在至少4个阶段击败他的车手,即在21个阶段中至少有4个阶段比Wiggins有更好时间的车手。我目前在:
SELECT ri.name
from riders ri
INNER JOIN results re ON ri.name = re.name
WHERE ri.name = 'BRADLEY Wiggins' IN ...`
我不确定如何进行比较2 time_seconds。
我可以知道如何获得解决方案吗?
谢谢
答案 0 :(得分:1)
这项任务确实有点复杂,因为它涉及多个概念。
第一个是自我加入,即您必须从同一个表中选择两次。你想要布拉德利的结果和其他人的结果。结果,以便能够比较它们。
select ...
from results bradley
join results other on ...
或者:
select ...
from (select * from results where ...) bradley
join (select * from results where ...) other on ...
让我们使用第一个选项。我们添加一个WHERE子句以便得到Bradley,我们添加ON子句以使非Bradleys处于同一阶段并获得更好的结果:
select ...
from results bradley
join results other on other.rider_id <> bradley.rider_id
and other.stage_id = bradley.stage_id
and other.time_seconds < bradley.time_seconds
where bradley.rider_id = (select id from riders where name = 'BRADLEY Wiggins')
最后一部分是找到至少有四个更好结果的车手。这称为聚合。你想看车手,所以你按rider_id分组。而你想要数,所以你使用COUNT。此外,您希望基于COUNT限制结果,因此您将其放在HAVING子句中:
select other.rider_id
from results bradley
join results other on other.rider_id <> bradley.rider_id
and other.stage_id = bradley.stage_id
and other.time_seconds < bradley.time_seconds
where bradley.rider_id = (select id from riders where name = 'BRADLEY Wiggins')
group by other.rider_id
having count(*) >= 4;
至于让骑手&#39;数据,例如他们的名字,有几个选择:
您可以更改SELECT子句:
select (select name from riders where id = other.rider_id) as name
这将是:
select *
from riders
where id in
(
select other.rider_id
from results bradley
join results other on other.rider_id <> bradley.rider_id
and other.stage_id = bradley.stage_id
and other.time_seconds < bradley.time_seconds
where bradley.rider_id = (select id from riders where name = 'BRADLEY Wiggins')
group by other.rider_id
having count(*) >= 4
);