MySQL从子查询中获得前16名的平均值
我有两张桌子,一队一队。一支球队可以有无限数量的球员,而一名球员只能属于一支球队 一个队的每个队员都有工资 我想得到每支球队前16名球员的平均工资,如果少于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
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,没有注意到。编辑了回复评论并删除了否决票。。。