douwei8672 2014-04-04 15:31
浏览 25
已采纳

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

I am currently trying to get data from my table (mostKills by Weapon in a table with over 300 kills). Initially I did a normal query

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

but when I tried to

            $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
            }

I had to do it in a while loop, which caused there to be around 600 queries, and that is obviously not acceptable. Do you have any tips on how I can optimize this, or even turn this into a single query?

I heared JOIN is good for this, but I don't know much about it, and was wondering if you guys could help me

  • 写回答

3条回答 默认 最新

  • doujiao3998 2014-04-04 15:40
    关注

    Try this...

    I added a inner join and added a username to your select clause. The MIN() is just a way to include the username column in the select and will not have an impact on you result as long as you have just 1 username for every Killerid

    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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路