我有下面的表:match_id,player_slot,能力,水平MySQL查询:简化子查询和联盟
有每场比赛10个播放器插槽,每个英雄最多可以有25级和五分之一能力。我从API中提取数据,并且需要快速提取数据,所以我没有太多灵活性来设置我的表。
但是,为了显示数据,我真的很努力地将现有的表格格式变成可行的东西。对于每场比赛,我想已经制定了这样的数据:
球员SLOT1,在1水平的能力,在2水平的能力,......,有能力在16级
...
球员时隙10,在1水平的能力,在2级能力,...,16级
我能得到一个工作示例(Here's an example)了,但它是一个非常丑陋的查询能力。对于每一行我有15个嵌套的子查询,然后执行一个联合来加入10行中的每一行。
摘录查询:
SELECT player_slot, ability,
(SELECT ability FROM api_abilities WHERE match_id = 119009486 AND player_slot = 1 AND level = 2),
...
(SELECT ability FROM api_abilities WHERE match_id = 119009486 AND player_slot = 1 AND level = 16)
FROM api_abilities
WHERE match_id = 119009486 AND player_slot = 1 AND level = 1
我怎么会去简化呢?我应该以不同的方式呈现这些数据来制作视图或新表格吗?同样复杂的是,每个玩家都会在不同的级别结束游戏。我现在所做的工作,但似乎必须有一个更有效的方式来运行查询。我尝试了一些不同的东西,但似乎无法使我的其他查询的行合并正确。
我会删除并调整player_slot ... – 2013-02-11 21:04:25
@Nitin Midha:是的,可以从查询中删除player_slot(> = 1和<= 10)上的谓词;但从OP不清楚10个播放器插槽的限制是否由查询执行,或者这是否是底层数据的限制。 – spencer7593 2013-02-11 21:06:42
谢谢,这个伎俩。 10个播放器插槽的限制是底层数据的一个限制,所以它在没有WHERE子句中的a.player_slot项目的情况下工作正常 – user1723535 2013-02-12 15:30:04