所以我有一个奥林匹克数据库,基本布局是有一个competitornum、givenname和familyname的竞争对手表(其他列不需要)
还有一个有竞争对手和位置(1到8之间)的结果表。
我正在试着获得givenname和familyname以及金牌、银牌和铜牌的总数(place=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
最佳答案
目前,您的查询正在执行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