MySQL从子查询中获得前16名的平均值

MySQL从子查询中获得前16名的平均值,mysql,subquery,Mysql,Subquery,我有两张桌子,一队一队。一支球队可以有无限数量的球员,而一名球员只能属于一支球队 一个队的每个队员都有工资 我想得到每支球队前16名球员的平均工资,如果少于16名球员,则取更低的工资 下面是一个示例模式: CREATE TABLE `teams` ( `id` INT(10) UNSIGNED NOT NULL, `name` VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL, `aw16 DECIMAL(10,2) UNSIGNED

我有两张桌子,一队一队。一支球队可以有无限数量的球员,而一名球员只能属于一支球队

一个队的每个队员都有工资

我想得到每支球队前16名球员的平均工资,如果少于16名球员,则取更低的工资

下面是一个示例模式:

CREATE TABLE `teams` (
  `id` INT(10) UNSIGNED NOT NULL,
  `name` VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `aw16 DECIMAL(10,2) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `players` (
  `id` INT(10) UNSIGNED NOT NULL,
  `name` VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `team_id` INT(10) UNSIGNED NOT NULL,
  `wage` INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
我可以一次轻松获得一支球队前16名的平均成绩,如下所示:

SELECT teams.name, AVG(players.wage)
FROM teams
INNER JOIN (
SELECT wage, team_id
FROM players
WHERE team_id = 1
ORDER BY wage DESC
LIMIT 16
) players
ON team_id = teams.id
GROUP BY teams.id
但我不知道如何在一个查询中为所有团队执行此操作,因此我可以在两列中列出团队ID和前16名的平均值

更重要的是,我实际上想做一个更新,用每个团队的计算结果填充团队表中的aw16字段,但这似乎更成问题。

试试这个

SELECT teams.name, AVG(players.wage)
FROM teams
INNER JOIN (
select wage, team_id
from players
where (
   select count(*) from players as p
   where p.team_id = players.team_id and p.wage >= players.wage
) <= 16
) players
ON team_id = teams.id
GROUP BY teams.id

基本上,您需要使用副本中的一种方法获取每个团队的前16名工资,然后将该查询用作现有查询中的派生表。@nick Thank,没有注意到。编辑了回复评论并删除了否决票。。。