mysql - MySQL 从子查询中获得前 16 名的平均值
问题描述
我有两张桌子Teams
和Players
. 一个团队可以有无限数量的玩家,一个玩家只能属于一个团队。
球队中的每个球员都有工资。
我想得到每支球队前 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 表中的字段,但这似乎更有问题。
解决方案
试试这个
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
推荐阅读
- sqlite - 如何对额外列中的两列行元素求和?
- git - .gitignore .gitattributes 声明的所有二进制文件
- javascript - 如何将值赋给会话密钥并同时将其作为参数应用?[Laravel 惯性 Vue]
- visual-studio - Visual Studio 社区 2019 发布错误
- javascript - 无法加载通过 ember-auto-import 导入 css 的模块
- eclipse - 如何在 Eclipse 中为 OSGI 项目添加 2 个发布者?
- python - Python在系统关闭之前做些什么?
- mongodb - 从 MOngodb 中的嵌套数组中删除值
- mysql - 如何使用“MATCH ... AGAINST”和 GROUP_CONCAT 进行标签搜索
- vue.js - nuxt vuetify 给出 SassError: Expected identifier