首页 > 解决方案 > MySQL 从子查询中获得前 16 名的平均值

问题描述

我有两张桌子TeamsPlayers. 一个团队可以有无限数量的玩家,一个玩家只能属于一个团队。

球队中的每个球员都有工资。

我想得到每支球队前 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用每个团队的计算填充 Teams 表中的字段,但这似乎更有问题。

标签: mysqlsubquery

解决方案


试试这个

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

推荐阅读