首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >前3个国家/地区

前3个国家/地区
EN

Stack Overflow用户
提问于 2011-10-31 09:03:46
回答 3查看 201关注 0票数 0

我的问题肯定是老生常谈,但我不能设置一个sql查询,使我可以为体育赛事汇总表列出前3个国家。我解释得更好:在一项体育赛事中,我有很多来自不同国家的运动员,我需要制作一个汇总表,显示获得奖牌更多的国家。下面是一个示例:

代码语言:javascript
运行
复制
--------------------------------------------
|id |     name    |   activity  | country  |
--------------------------------------------
| 1 |  John       |   100m      |  USA     |
| 2 |  Andy       |   200m      |  CANADA  |
| 3 |  Frank      |   400m      |  USA     |
| 4 |  Ian        |   400m      |  GERMANY |
| 5 |  Anthony    |   100m      |  USA     |
| 6 |  Eric       |   400m      |  CANADA  |
| 7 |  Mike       |   200m      |  UK      |
| 8 |  Dave       |   200m      |  GERMANY |
| 9 |  Richard    |   100m      |  USA     |
| 10|  Max        |   100m      |  USA     |
| 11|  Randy      |   100m      |  USA     |
| 12|  Maurice    |   400m      |  CANADA  |
| 13|  Col        |   100m      |  UK      |
| 14|  Jim        |   400m      |  USA     |
| 15|  Adam       |   200m      |  BRAZIL  |
| 16|  Ricky      |   100m      |  UK      |
| 17|  Emily      |   400m      |  USA     |
| 18|  Serge      |   200m      |  UK      |
| 19|  Alex       |   400m      |  FRANCE  |
| 20|  Enamuel    |   100m      |  USA     |
--------------------------------------------

我希望获取的汇总表如下:

前3个国家/地区

代码语言:javascript
运行
复制
--------------------------------------
| position |    country    | medals  |
--------------------------------------
|     1    |     USA       |    9    |
|     2    |     UK        |    4    |
|     3    |     CANADA    |    3    |
--------------------------------------

如何构建qsl查询?提前感谢您的友好答复。

马修

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-31 09:07:04

没有position列,这就很简单了。只需执行以下操作

代码语言:javascript
运行
复制
SELECT Country,COUNT(*) AS medals
FROM MyTable
GROUP BY Country
ORDER BY COUNT(*) DESC
LIMIT 3;

还有一些更复杂的代码来获取"position“列,但除非需要,否则可能不需要,您可以在处理代码中使用计数器来获取这些数字。如果你感兴趣,代码应该是这样的。

代码语言:javascript
运行
复制
SELECT @rownum:=@rownum+1 AS Position,Country,Medals FROM
(
SELECT Country,COUNT(*) AS medals
FROM Medals
GROUP BY Country
ORDER BY COUNT(*) DESC
LIMIT 3
) AS Stats, (SELECT @rownum:=0) RowNum;

上面的查询已经过测试,看起来像您需要的那样工作。

票数 2
EN

Stack Overflow用户

发布于 2011-10-31 09:29:55

代码语言:javascript
运行
复制
CREATE TABLE IF NOT EXISTS top_three_countries 
   (position INT NOT NULL AUTO_INCREMENT, country VARCHAR(30), medals INT);
TRUNCATE TABLE top_three_countries;
INSERT INTO top_three_countries (country, medals) 
   SELECT country, count(*) total
   FROM medal
   GROUP BY country
   ORDER BY total DESC
   LIMIT 3;

这将生成您所描述的汇总表(top_three_countries)。

票数 1
EN

Stack Overflow用户

发布于 2011-10-31 09:16:02

如果你可以在你的程序逻辑中添加它,那么没有排名就简单多了:

代码语言:javascript
运行
复制
SELECT `country`, COUNT(*) total
FROM medal
GROUP BY country
ORDER BY total DESC
LIMIT 3

看起来Kibbee也打败了我,但是为了保证与GROUP BY兼容的查询,您可以将上面的代码封装在它自己的SELECT中:

代码语言:javascript
运行
复制
SELECT @n:=@n+1 AS rank, country, total
FROM
  (
    SELECT `country`, COUNT(*) total
    FROM medal
    GROUP BY country
    ORDER BY total DESC
    LIMIT 3
  ) t1,

(SELECT @n:=0) t2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7949101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档