我目前正在尝试从我的桌子获取数据(武器中的大多数杀手都在超过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对此有好处,但我对此并不了解,并且想知道你们是否可以帮助我
答案 0 :(得分:1)
试试这个......
我添加了inner join
并在您的select子句中添加了username
。 MIN()
只是在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/
最好的方法是掌握自己的知识,这样您就可以调整选择的查询。
同时为您的数据库添加更多索引,并尝试按索引搜索和加入。