所以我有一个奥林匹克数据库,基本布局是有一个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

08-06 17:46