2012-09-11 45 views
2

所以,我有一個奧運的數據庫,基本佈局是,有一個競爭對手錶competitornum,給定名稱,並familyname(其他列是沒有必要爲這個) 還有一個結果表competitornum和地點(在1和8之間)。子查詢的SQL

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

這裏是我到目前爲止有:

SELECT c.Givenname, c.Familyname, places AS TotalPlaces 
FROM Competitors c, 
     (SELECT COUNT(*) as places 
     FROM Results r, Competitors c 
     WHERE r.Competitornum = c.Competitornum 
     AND r.Place > 0 
     AND r.Place < 4) q 

但是它返回每個人的名字,和相同的總名額(這恰好是78)。例如

John Smith 78 
Cassandra Jane 78 
Bob Turner 78 

回答

1

當前您的查詢是執行CROSS JOIN生產caertesian產品。

當使用聚合函數(count,max,min,...)時,記錄應該按非聚合列分組。試試這個,

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 
+0

'r.place介於0和4' – hjpotter92

+0

@GiantofaLannister有啥'IN(1,2,3)'和'介於0和4'的diffrerence? –

+0

如果OP希望改變範圍? – hjpotter92