2015-10-14 75 views
-1

用於此問題的數據庫的結構如下,主鍵加粗和外鍵''。加入聲明和比較


國家(名稱,COUNTRY_ID,area_sqkm,人口)

隊(TEAM_ID,名字, 'COUNTRY_ID',描述,經理)

階段(stage_id,took_place ,start_loc,end_loc,distance,description)

騎士(rider_id,名稱, 'TEAM_ID',year_born,height_cms,weight_kgs, 'COUNTRY_ID',BMI)

結果( 'stage_id', 'rider_id',time_seconds)


我堅持在問題:

問:布拉德利威金斯贏得了參觀。寫下一個查詢,以查找至少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

學校工作?檢出GROUP BY並計數(*)。 – jarlh

+0

'JOIN結果re ON ri.name = re.name'不會飛,因爲'result'表沒有這樣的列'name'。嘗試'加入結果re ON ri.id = re.rider_id' – Bohemian

回答

1

的任務的確是有點複雜,因爲它涉及到的幾個概念。

其中第一個是自加入,即您必須從同一個表中選擇兩次。你想要布拉德利的結果和其他人的結果,以便能夠比較它們。

select ... 
from results bradley 
join results other on ... 

或者:

select ... 
from (select * from results where ...) bradley 
join (select * from results where ...) other on ... 

讓我們用第一個選項。我們添加一個WHERE子句,以便讓布拉德利和我們添加ON子句在同一個舞臺讓非布拉德利有更好的結果:

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; 

,以便充分車手的數據,例如他們的名字有幾種選擇:

  1. 加入表並將列都放入您的SELECT子句和您的GROUP BY子句中。如果你需要兩套數據,即騎手的數據加上結果數,你會這樣做。
  2. 如果您只需要一個值(例如名稱),請選擇該值。這很簡單,但只有當你只需要騎手錶中的一個值時纔有意義。

你會因此改變你的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 
    );