2013-11-23 33 views
0

我正在尝试解决游戏服务器的查询。SQL嵌套INNER JOIN冻结PHPmyadmin面板

下面的SQL打算做的是找到所有使用“sniperRifle”的人,其中有多种类型,然后为每个单独的玩家杀死每个武器。

我已经写了下面的SQL来尝试实现这一点,但每次我测试SQl类似于此PHPmyAdmin面板停止工作,我必须票证主机以修复它。

有没有更好的方法来执行下面的查询或修复它的方法,使其不冻结。

*

SELECT pd.SoldierName, ks.Kills 
FROM tbl_playerdata pd INNER JOIN (
    SELECT sp.PlayerId, SUM(ws.Kills) as Kills 
    FROM tbl_weapons w, tbl_server_player sp, tbl_weapons_stats ws 
    GROUP BY sp.PlayerID) ks 
on w.Damagetype = "sniperrifle" and w.WeaponID = ws.WeaponID and sp.StatsID = ws.StatsID 
WHERE pd.PlayerID = ks.PlayerID 
ORDER BY Kills DESC, SoldierName; 

任何帮助将是巨大的。

感谢

回答

0

移动限制外部查询你的内心查询结果自己内心的查询应该给予一定的性能提升,因为它更容易为优化器限制产生的组合数量的条件;

SELECT pd.SoldierName, ks.Kills 
FROM tbl_playerdata pd INNER JOIN (
    SELECT sp.PlayerId, SUM(ws.Kills) as Kills 
    FROM tbl_weapons w 
    JOIN tbl_weapons_stats ws ON w.WeaponID = ws.WeaponID 
    JOIN tbl_server_player sp ON sp.StatsID = ws.StatsID 
    WHERE w.Damagetype = "sniperrifle" 
    GROUP BY sp.PlayerID) ks 
ON pd.PlayerID = ks.PlayerID 
ORDER BY Kills DESC, SoldierName; 

如果不给予足够的改善,你需要运行某种形式的EXPLAIN(取决于你的RDBMS),以显示哪些索引 - 如果有的话 - 使用或漏诊。