SQL - 没有order by的top结果的子查询

时间:2012-09-11 01:39:07

标签: mysql sql subquery

(对不起标题,想不出怎么解释)

所以我有一个奥林匹克数据库,基本的布局是有竞争对手的表,其中包含竞争对手,给定名称和姓氏(其他列不是必需的)还有一个带竞争对手的结果表和地点(在1和1之间) 8)。

我正在尝试获取金牌,银牌和铜牌的名字和姓氏以及总数(地点= 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))

但我不确定如何在子查询中使用子查询中的别名...

感谢所有帮助,谢谢!

编辑:关于我的任务的官方问题(我无法弄清楚答案,我真的尝试过,这就是我在这里的原因):

哪些竞争对手得到的奖牌数量最多(一共计算金牌,银牌和铜牌)?列出他们的姓名和姓氏以及他们的奖牌总数(仅限)。

警告:您的解决方案不得假设竞争对手的名称总是不同 请勿在此查询的任何部分使用ORDER BY子句。

2 个答案:

答案 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)

最终答案(感谢John Woo和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
                )
            )