gpt4 book ai didi

php - 使用内部查询优化查询

转载 作者:行者123 更新时间:2023-11-29 08:18:36 24 4
gpt4 key购买 nike

我正在开发一个应用程序,使用 PHP 可视化 MySQL 数据库中的数据。这是关于《战地 4》中谁杀死了谁的日志。我想按降序列出使用特定武器的杀戮次数,并按显示该人杀死的人的列表进行分割,也按降序排列。

数据库结构:

BF4 Database Structure

我的 PHP 代码将其可视化在表格上:

<?php
$con = mysql_connect("localhost", "bf4", "bf4") or die(mysql_error());
mysql_select_db("bf4") or die(mysql_error());

$query = mysql_query("SELECT p.playerId AS pid, p.playerName AS name,
COUNT(`playerkills`.`id`) AS amount FROM `playerkills`
JOIN players p ON playerkills.playerId = p.playerId
WHERE weaponId = 9 GROUP BY playerkills.playerId ORDER BY amount DESC;")
or die(mysql_error());

$i = 0;
$lastamount = -1;
$offset = 0;
while ($result = mysql_fetch_object($query)) {
if ($lastamount != $result->amount) {
$i += 1 + $offset;
$offset = 0;
} else {
$offset++;
}
echo "<tr><td>".$i."</td><td>".$result->name."</td><td>".$result->amount."</td></tr>";
echo "<tr><th></th><th>Target</th><th>Kills</th></tr>";

$query_inner = mysql_query("SELECT p.playerName AS name,
COUNT(`playerkills`.`id`) AS amount FROM `playerkills`
JOIN players p ON playerkills.targetId = p.playerId
HERE weaponId = 9 AND playerkills.playerId = '{$result->pid}'
GROUP BY playerkills.targetId ORDER BY amount DESC;");

while ($result_inner = mysql_fetch_object($query_inner)) {
echo "<tr><td></td><td>".$result_inner->name."</td><td>".$result_inner->amount."</td></tr>";
}
$lastamount = $result->amount;
}
mysql_close($con) or die(mysql_error());
?>

现在出现了额外的要求,这可能会让它变得更有趣:如果网站用户要求(通过单击列来指示,我'),它应该只显示分割数据(内部查询)稍后将在 Javascript 中实现)。现在有没有办法进一步优化查询?

最后一个在已填充数据库上运行的代码示例:

BF4 example

我希望问题得到明确的形式化,如果您仍然有疑问,那么我将相应地更新这篇文章。

最佳答案

在循环内查询数据库不好,这样会创建太多查询。您可以通过具有不同分组的两个查询获得相同的结果。这两个查询中的每一个都应该将playerkills表与武器表和玩家表连接起来。

通过按玩家 ID 对第一个查询进行分组,您将获得该玩家的总击杀数。然后,通过按playerId对第二个查询进行分组,targetId将为您提供每个目标玩家的击杀数。

例如(未测试)

查询1 - 每个玩家的总结果

SELECT p.playerId AS pid, p.playerName AS player, COUNT(*) AS kills
FROM playerkills pk
JOIN players p ON p.playerId = pk.playerId
WHERE weaponId = 9
GROUP BY p.playerId,p.playerName ORDER BY kills DESC;

查询2 - 目标的详细结果

SELECT p2.playerName AS target, COUNT(*) AS kills 
FROM playerkills pk
JOIN players p ON p.playerId = pk.playerId
JOIN players p2 ON p2.playerId = pk.targetId
WHERE weaponId = 9
GROUP BY p.playerId,p2.playerId,p2.playerName ORDER BY p.playerId, kills DESC;

只有当用户询问详细信息时才可以调用第二个查询,正如您所指出的,在这种情况下,您可以在 where 之后添加类似 AND p.playerId= $pid 的内容 子句。在这种情况下,order by 中不需要 p.playerId,因为您只会获得特定玩家的结果,并且只需迭代它们即可。

关于php - 使用内部查询优化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20030767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com