2012-09-11 50 views
0

(很抱歉的標題,也想不出該如何解釋)SQL - 子查詢頂級的結果,而不爲了通過

所以,我有一個奧運的數據庫,基本佈局是,有一個競爭對手錶competitornum ,givenname和familyname(其他欄不需要這個)還有一個結果表與competitornum和地點(1到8之間)。

我試圖獲得給定名稱和familyname和金,銀總數,和銅牌(地點= 1,2或3)

它還需要僅顯示與所述頂部的結果獎牌數,而這一切,而不使用ORDER BY子句...

我問這個問題之前,但意識到我忘記說了一些事情,但加入了加粗部分之前以前的答案是:

SELECT c.Givenname, c.Familyname, COUNT(r.places) AS TotalPlaces 
FROM Competitors c INNER JOIN Results r 
    ON r.Competitornum = c.Competitornum 
WHERE r.place IN (1,2,3) 
GROUP BY c.Givenname, c.Familyname 

我想這需要另一個子查詢像

AND TotalPlaces = (SELECT MAX(TotalPlaces)) 

,但我不知道如何使用別名的子查詢時,它的子查詢以上......

所有幫助表示感謝,謝謝!

編輯:我的任務正式的問題(我想不出答案,我真的盡力了,這就是爲什麼我在這裏):

哪個競爭對手(S)得到數最多獎牌(一起計算金,銀和銅)?列出他們的給定姓氏和他們的獎牌總數(僅限)。

警告:您的解決方案不得假定競爭對手的名稱始終不同 請勿在此查詢的任何部分使用ORDER BY子句。

+0

「所有這些都沒有使用Order By子句」?這就像說我想學習如何游泳,但不要把水放在泳池裏!或....這是作業嗎? (如果你真的有一個很好的理由不使用Order By,你不應該在這個問題中說出來嗎?) –

+0

這是一個任務,我無法弄清楚D: 我不認爲我們需要order by clause雖然 –

+0

作爲一個方面提示:「GROUP BY c.Givenname,c.Familyname'」和「您的解決方案不得假定競爭對手的名字總是不同」是矛盾的。 –

回答

0

最終的答案(感謝吳宇森和LC)。 粘貼在這裏,這對於遇到這個問題在未來的任何人:

SELECT c.Givenname, c.Familyname, COUNT(r.place) AS TotalPlaces 
FROM Competitors c 
INNER JOIN Results r ON r.Competitornum = c.Competitornum 
WHERE r.place IN (1,2,3) 
GROUP BY c.competitornum, c.Givenname, c.Familyname 
HAVING COUNT(r.place) = 
      (
       SELECT MAX(TotalPlaces) 
       FROM 
       (
        SELECT COUNT(r.place) AS TotalPlaces 
        FROM Competitors c 
        INNER JOIN Results r ON r.Competitornum = c.Competitornum 
        WHERE r.place IN (1,2,3) 
        GROUP BY c.competitornum, c.Givenname, c.Familyname 
       ) 
      ) 
+0

我的答案有什麼問題? –

4

你需要有另一個子查詢爲此,

SELECT c.Givenname, c.Familyname, COUNT(r.places) AS TotalPlaces 
FROM Competitors c 
INNER JOIN Results r ON r.Competitornum = c.Competitornum 
WHERE r.place IN (1,2,3) 
GROUP BY c.Givenname, c.Familyname 
HAVING COUNT(r.places) = 
      (
       SELECT MAX(TotalPlaces) 
       FROM 
       (
        SELECT COUNT(g.places) AS TotalPlaces 
        FROM Competitors f 
        INNER JOIN Results g ON f.Competitornum = g.Competitornum 
        WHERE g.place IN (1,2,3) 
        GROUP BY f.Givenname, f.Familyname 
       ) 
      ) 
+1

打敗我吧。 :) –

+0

由於我們必須假定名稱可能是相同的,我們不是假設不按名稱進行分組,所以該程序說最後一個組有錯誤... ...。爲了解決這個問題,我想我可以根據競爭者名字,姓氏,家族名稱進行分組?但是我不允許在輸出中顯示競爭者... –

+0

@CoreyThompson你不必選擇一些東西來分組,所以你是正確的將競爭者添加到列表中。 :) –