我正在制作排名系统。但我想要的是将我得到的结果($kn
)从最高到最低排序。我怎么能这样做?
include "includes/core.inc.php";
require "includes/connect.inc.php";
$id = $_GET["id"];
$query = "SELECT * FROM submitted WHERE id= '$id'";
$query_run = $db->query($query);
while($row = mysqli_fetch_assoc($query_run)){
$name= $row["name"];
$sql = "SELECT * FROM submitted WHERE name= '$name' AND pending = 'Accept'";
$sql_run = $db->query($sql);
$count = $sql_run->num_rows;
$nums= "SELECT * FROM ranking WHERE name= '$name'";
$nums_run = $db->query($nums);
$num = $nums_run->num_rows;
$kn = ($count * 0.4) + (($num * 0.2) * 3);
echo '$name';
echo '$kn';
}
答案 0 :(得分:1)
循环遍历列表并查询每个元素几乎不是一个好主意。相反,您可以将整个逻辑移动到查询中,然后在那里对其进行排序:
$query =
"SELECT s.name AS name, (cnt_submitted * 0.4) + ((cnt_ranking * 0.2) * 3) AS kn
FROM (SELECT name, COUNT(*) AS cnt_submitted
FROM submitted
WHERE id = '$id' AND
pending = 'Accept'
GROUP BY name) s
JOIN (SELECT name, COUNT(*) AS cnt_ranking
FROM ranking
GROUP BY name) r ON r.name = s.name
ORDER BY 2 DESC";
$query_run = $db->query($query);
while ($row = mysqli_fetch_assoc($query_run)) {
$name = $row["name"];
$kn = $row["kn"];
echo '$name';
echo '$kn';
}
注意:强>
$id
变量应该是comments中的绑定变量,以防止SQL注入攻击。
不过,我把它留在OP中,因为这不是问题的关键,我不想再增加混淆。
答案 1 :(得分:0)
您也可以在PHP中执行此操作:
$result = [];
while (...) {
.....
$kn = ($count * 4) + (($num * 2) * 30);
$result[] = [
'rank' => $kn,
'name' => $name
];
}
usort($result, function($a, $b) {
return $b['rank'] - $a['rank'];
});