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

标签 php mysql sql sorting query-optimization

我目前正在尝试从我的表中获取数据(在超过 300 次击杀的表中按武器列出的mostKills)。最初我做了一个正常的查询

$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 个查询,这显然是 Not Acceptable 。您对如何优化它,甚至将其变成单个查询有什么建议吗?

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

最佳答案

试试这个...

我添加了一个内部联接,并在您的 select 子句中添加了一个用户名MIN() 只是在 select 中包含 username 列的一种方法,只要您每个 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

关于php - 如何将循环中的这两个查询转换为单个 JOINed 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22866990/

相关文章:

mysql - MySQL可以替换多个字符吗?

php - 如何匹配选择查询中的字符串数组?

php - 未签名的 int 到 php 中的签名

MySQL:如何检查提供的值是数字/整数还是字母?

php - mysqli 多个查询 - 设置变量产生 bool 错误/如何跳过这个?

mysql - 一起使用三个表的 SQL 查询没有返回正确的结果?

php - 如何在 PHP 中获取以毫秒为单位的当前时间?

javascript - 从 html 页面到 PHP 页面的 anchor 链接

mysql - 用IN选择,过滤匹配的结果

sql - 为什么一个SQL表有多个主键?