我的问题肯定是老生常谈,但我不能设置一个sql查询,使我可以为体育赛事汇总表列出前3个国家。我解释得更好:在一项体育赛事中,我有很多来自不同国家的运动员,我需要制作一个汇总表,显示获得奖牌更多的国家。下面是一个示例:
--------------------------------------------
|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个国家/地区
--------------------------------------
| position | country | medals |
--------------------------------------
| 1 | USA | 9 |
| 2 | UK | 4 |
| 3 | CANADA | 3 |
--------------------------------------
如何构建qsl查询?提前感谢您的友好答复。
马修
发布于 2011-10-31 09:07:04
没有position列,这就很简单了。只需执行以下操作
SELECT Country,COUNT(*) AS medals
FROM MyTable
GROUP BY Country
ORDER BY COUNT(*) DESC
LIMIT 3;
还有一些更复杂的代码来获取"position“列,但除非需要,否则可能不需要,您可以在处理代码中使用计数器来获取这些数字。如果你感兴趣,代码应该是这样的。
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;
上面的查询已经过测试,看起来像您需要的那样工作。
发布于 2011-10-31 09:29:55
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)。
发布于 2011-10-31 09:16:02
如果你可以在你的程序逻辑中添加它,那么没有排名就简单多了:
SELECT `country`, COUNT(*) total
FROM medal
GROUP BY country
ORDER BY total DESC
LIMIT 3
看起来Kibbee也打败了我,但是为了保证与GROUP BY
兼容的查询,您可以将上面的代码封装在它自己的SELECT
中:
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
https://stackoverflow.com/questions/7949101
复制相似问题