循环数据时排序

时间:2016-08-30 18:19:26

标签: php mysql loops while-loop

我正在制作排名系统。但我想要的是将我得到的结果($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';
}

2 个答案:

答案 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'];
});