Sak*_*lam 5 mysql database-design group-by mysql-5.6 greatest-n-per-group
我需要建立一个梦幻足球游戏用户排行榜。游戏的简化数据库如下:
users
必须squad_players
在squads
每一个matches
(由相关transfer_period)players
有match_points
每个matches
squad_players
有位置,优先。该优先级是如果换人的顺序squad_players
不会出现在matches
squads
具有formations
确定从优先级排序的每个位置中选择的最大玩家数量数据库为MySQL 5.6,最大数量users
为10K。
我能够内部加入(按顺序)squad_players
, squads
, matches
,match_points
以获得每个squad_players
玩过的人(players
没有玩过的人没有match_points
)的观点。
我奋力SUM的分X squad_players
每squads
其中X是formations
通过确定位置的的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)
附加信息
squads
并match_points
插入.positions
我最终实现的解决方案是根据和的不同排列将查询分解为更简单的查询formations
。我还需要添加几个表来存储中间结果。我在一个事务中运行了所有查询(大约 42 个)。
效果非常好,并且在合理的时间内完成,并且没有使服务器资源超载。
我想尝试在一个巨大的查询中做到这一点从一开始就是一个错误的决定。将其分解为更小的查询使该过程变得可维护且灵活。
归档时间: |
|
查看次数: |
800 次 |
最近记录: |