加入声明和比较

时间:2015-10-14 07:39:18

标签: sql join

用于此问题的数据库的结构如下,主键加粗,外键和#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。

我可以知道如何获得解决方案吗?

谢谢

1 个答案:

答案 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;数据,例如他们的名字,有几个选择:

  1. 加入表并将列放在SELECT子句和GROUP BY子句中。你会这样做,如果你想要两组的数据,即骑手&#39;数据加上结果计数。
  2. 如果您只想要一个值(例如名称),则选择该值。这很简单,但只有当你只需要一个骑手表中的值时才有意义。
  3. 您可以更改SELECT子句:

    select (select name from riders where id = other.rider_id) as name
    
    1. 围绕您已有的查询编写外部查询。
    2. 这将是:

      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
      );