如何将循环中的这两个查询转换为单个JOINed查询?

时间:2014-04-04 15:31:32

标签: php mysql sql sorting query-optimization

我目前正在尝试从我的桌子获取数据(武器中的大多数杀手都在超过300次杀戮的桌子中)。最初我做了一个普通的查询

$q = $mysql->query("SELECT * FROM `kills`") or die($mysql->error);

但是当我试图

            $query2 = $mysql->query("SELECT `killerID`, COUNT(`killerID`) AS tot_kills FROM `kills` WHERE `killText` LIKE '%$gun%' GROUP BY `killerID` ORDER BY `tot_kills` DESC;") or die($mysql->error);
            $kData = $query2->fetch_assoc();

            $query3 = $mysql->query("SELECT `Username` FROM `players` WHERE `ID` = '" . $kData['killerID'] . "'") or die($mysql->error);
            $uData = $query3->fetch_assoc();

            $array[$gun]['Kills']++;
            $array[$gun]['Gun'] = $gun;
            $array[$gun]['BestKiller'] = $uData['Username'];
            $array[$gun]['killAmount'] = $kData['tot_kills'];

            function sortByKills($a, $b) {
                return  $b['Kills'] - $a['Kills'];
            }

            usort($array, 'sortByKills');

            foreach($array as $i => $value) 
            {
                // table here
            }

我必须在while循环中执行此操作,这导致大约600个查询,这显然是不可接受的。您是否有任何关于我如何优化此功能的提示,或者甚至将其转换为单个查询?

我听说JOIN对此有好处,但我对此并不了解,并且想知道你们是否可以帮助我

3 个答案:

答案 0 :(得分:1)

试试这个......

我添加了inner join并在您的select子句中添加了usernameMIN()只是在username中添加select列的一种方式,只要您的每个Killerid只有 1个用户名,就不会对您的结果产生影响/强>

SELECT `killerID`
    , COUNT(`killerID`) AS tot_kills
    , MIN(`Username`) AS username
FROM `kills`
INNER JOIN `players`
    ON `players`.`id` = `kills`.`killerid`
WHERE `killText` LIKE '%$gun%'
GROUP BY `killerID`
ORDER BY `tot_kills` DESC

答案 1 :(得分:0)

选择kills.killerID,count(kills.killerID)为killTotal,players.Username         来自杀戮,玩家         在哪里kills.killText         喜欢'%$ gun%'         AND players.ID` = kills.killerID         GROUP BY kills.killerID ORDER BY kills.tot_kills DESC

答案 2 :(得分:0)

这是一个学习更多关于联接的好地方。 http://www.sitepoint.com/understanding-sql-joins-mysql-database/

最好的方法是掌握自己的知识,这样您就可以调整选择的查询。

同时为您的数据库添加更多索引,并尝试按索引搜索和加入。