Mysql SQL查询和子查询
我有一个问题要问所有的SQL专家 有一张桌子看起来像:Mysql SQL查询和子查询,mysql,subquery,Mysql,Subquery,我有一个问题要问所有的SQL专家 有一张桌子看起来像: clanname country points name1 country1 100 name2 country1 90 name3 country1 10 name4 country2 100 name5 country2 80 name6 country2 70 我想做一个国家排名,只涉及每个国家的前2名的结果。因此,在本例中,
clanname country points
name1 country1 100
name2 country1 90
name3 country1 10
name4 country2 100
name5 country2 80
name6 country2 70
我想做一个国家排名,只涉及每个国家的前2名的结果。因此,在本例中,排名应为:
country average-points
country2 95
country1 90
是否有一种方法可以使用子查询仅通过一个SQL查询获得此结果
实际上,我有200多个国家。。每个国家都有数千个结果。但我只想筛选每个国家前30名的结果
现在,我通过这个查询获得了一个国家的平均值:
SELECT
location, AVG(warswon)
FROM
(SELECT
`name`, `location`, `warswon`
FROM
`clans`
WHERE
location = 'China'
ORDER BY
`clans`.`warswon` DESC
LIMIT 30) AS top30ofcountry
但如何在一次查询中得到每个国家的平均结果呢
这可能吗 这是每组n个问题。这在许多使用行数的数据库中是微不足道的。在MySQL中,您可以使用用户变量来实现这一点
SELECT
country ,
avg(points)
FROM
(
SELECT
@num := if(@group = `country`, @num + 1, 1) as row_number,
@group := `country` as dummy,
clanName,
country,
points
FROM
clans
JOIN (SELECT @group := NULL, @num := 0) as z
order by
country, points desc) as x
WHERE x.row_number <=2
GROUP BY
country
谢谢你的帮助,康拉德。 我只需稍微更改您提出的代码,就可以获得所需的结果。 以下是针对那些有类似问题的人的最终工作查询:
SELECT
location,
avg(warswon)
FROM
(
SELECT
@num := if(@group = `location`, @num + 1, 1) as row_number,
@group := `location` as dummy,
name,
location,
warswon
FROM
clans
JOIN (SELECT @group := NULL, @num := 0) as z
order by
location, warswon desc
) as x
WHERE x.row_number <= 30
GROUP BY `location`
ORDER BY avg(warswon) DESC
GROUP BY[fieldname]在末尾添加GROUP BY LOCATION为什么需要对此进行子查询?这曾经是Sql Server的标记。。。这是否仍然适用?由于支持窗口功能,Sql Server和大多数其他数据库使此操作变得简单。在MySql中,这将比其他数据库困难得多,因为它现在是唯一一个不支持窗口功能的主要数据库,尽管它们已经成为标准的一部分超过10年了。我非常喜欢SQL Server中的行数函数,以获得每类过滤器的前n名。您可以在子查询或CTE中按国家/地区顺序按点描述作为RN在分区上添加行号。然后,按国家分组,在那里。。我觉得这接近我需要的问题。我使用mysql和所有来自前帖子的分组提议都没有帮助。