我正在开发一个使用PHP可视化来自MySQL数据库的数据的应用程序。它是关于杀死谁的战地4中的日志。我想按降序列出具有特定武器的杀戮次数,并按照显示该人死亡人数的列表进行细分,也按降序排列。
数据库结构:
我的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中实现它)。现在还有办法进一步优化查询吗?
作为在填充数据库上运行的代码的最后一个示例:
我希望这个问题能够清楚地形成,如果你还有问题,那么我会相应地更新这篇文章。
答案 0 :(得分:1)
在循环中查询数据库并不好,你用这种方式创建了太多的查询。您可以使用具有不同分组的两个查询获得相同的结果。两个查询中的每一个都应该使用武器表和玩家表加入playerkills表。
通过playerId对第一个查询进行分组,可以获得该玩家的总杀人数。然后通过playerId对第二个查询进行分组,targetId将为每个目标玩家提供杀戮。
例如(未经测试),
query1 - 每位玩家的总结果
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;
query2 - 目标的详细结果
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;
只有当用户要求提供详细信息时,才能调用第二个查询,如您所示,在这种情况下,您可以在AND p.playerId= $pid
子句后添加where
之类的内容。在这种情况下,order by
中不需要p.playerId,因为您只能获得特定玩家的结果,而您只需遍历它们。
答案 1 :(得分:1)
对此的确切答案将很长。
我建议您尝试使用“WITH ROLLUP”修饰符。
With ROLLUP肯定会优化sql端的工作,但需要一些PHP技巧。 你应该把结果放在一个JSON对象中,然后用javascript intead管理你的html表,静态地创建它们的php端。
如果有太多的数据确实在javascript上管理结果,那么你应该改变方法。
您首先需要一个PHP页面来为您生成JSON详细信息(Web服务,称之为GetDetails.php?someParams)。然后您的主页应该只执行外部查询并在每一行上放置一个链接以进行扩展。 展开它意味着调用一个将查询GetDetails.php的AJAX脚本?并通过DOM在表中添加新行。
希望这有帮助