使用 ORDER BY 和 LIMIT 对每个组的 n 行求和,其中 LIMIT 是基于另一个表

Sak*_*lam 5 mysql database-design group-by mysql-5.6 greatest-n-per-group

我需要建立一个梦幻足球游戏用户排行榜。游戏的简化数据库如下:

  • users必须squad_playerssquads每一个matches(由相关transfer_period
  • playersmatch_points每个matches
  • squad_players位置优先。该优先级是如果换人的顺序squad_players不会出现在matches
  • squads具有formations确定从优先级排序的每个位置中选择的最大玩家数量

数据库为MySQL 5.6,最大数量users10K

我能够内部加入(按顺序)squad_players, squads, matches,match_points以获得每个squad_players玩过的人(players没有玩过的人没有match_points)的观点。

我奋力SUM的分X squad_playerssquads其中Xformations通过确定位置的的squad_players

我试图通过具有相关子查询的group by修改Top n-rows 的版本,但没有成功。

我的方法应该是什么?


我的预期输出是这样的

|---------|-----------|------------|----------|
| User ID |  SQUAD ID | POSITION   |  POINTS  |  
|---------|-----------|------------|----------|
|   12    |    34     | defender   |    12    |
|---------|-----------|------------|----------|
|   12    |    34     | forward    |    2     |
|---------|-----------|------------|----------|
|  117    |    31     | midfielder |    5     |
|---------|-----------|------------|----------|
Run Code Online (Sandbox Code Playgroud)

注意事项

  • 我必须添加输出可能无法反映问题陈述。

  • 如果您查看Sample Dataset Link,您会发现一个名为视图的视图normalized_squad_player_points,该视图是我想要用来创建不同统计数据的非规范化表。

排行榜的最终输出将是这样的

|---------------------|------------------|
|      User ID        |       Points     |
|---------------------|------------------|
|          12         |         34       |
|---------------------|------------------|
|          56         |         32       |
|---------------------|------------------|
|          117        |         31       |
|---------------------|------------------|
Run Code Online (Sandbox Code Playgroud)

附加信息

Sak*_*lam 1

positions我最终实现的解决方案是根据和的不同排列将查询分解为更简单的查询formations。我还需要添加几个表来存储中间结果。我在一个事务中运行了所有查询(大约 42 个)。

效果非常好,并且在合理的时间内完成,并且没有使服务器资源超载。

我想尝试在一个巨大的查询中做到这一点从一开始就是一个错误的决定。将其分解为更小的查询使该过程变得可维护且灵活。