Mysql 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名的结果。因此,在本例中,

我有一个问题要问所有的SQL专家

有一张桌子看起来像:

 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和所有来自前帖子的分组提议都没有帮助。