【问题标题】:How can I convert these two queries in a loop into a single JOINed query?如何将循环中的这两个查询转换为单个 JOINed 查询?
【发布时间】:2014-04-04 15:31:32
【问题描述】:

我目前正在尝试从我的表中获取数据(在一个超过 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 很适合这个,但我对此不太了解,想知道你们是否可以帮助我

【问题讨论】:

    标签: php mysql sql sorting query-optimization


    【解决方案1】:

    试试这个...

    我在您的 select 子句中添加了 inner join 并添加了 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
    

    【讨论】:

    • on 子句中的列 'id' 不明确
    • 立即尝试.. 在 on 子句的 id 列中添加别名
    【解决方案2】:

    SELECT kills.killerID, count(kills.killerID) as killTotal, player.Username 从击杀,玩家 WHERE kills.killText 喜欢“%$gun%” AND player.ID` = kills.killerID GROUP BY kills.killerID ORDER BY kills.tot_kills DESC

    【讨论】:

      【解决方案3】:

      这里是了解有关联接的更多信息的好地方。 http://www.sitepoint.com/understanding-sql-joins-mysql-database/

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

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

      【讨论】:

        猜你喜欢
        • 2020-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-02
        • 2013-02-03
        • 2023-03-21
        相关资源
        最近更新 更多