【问题标题】:Order while loop data排序while循环数据
【发布时间】:2017-01-07 03:40:39
【问题描述】:

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

【问题讨论】:

标签: php mysql loops while-loop


【解决方案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 变量可能应该是 prepared statement 中的绑定变量,以防止 SQL 注入攻击。 不过,我将其保留在 OP 中,因为这不是问题的重点,我不想增加额外的混乱。

【讨论】:

  • 这个查询没有意义(group 1 row) SELECT name, COUNT(*) AS cnt_submitted FROM submit WHERE id = '$id' AND pending = 'Accept' AND GROUP BY name跨度>
  • @AndrejLudinovskov yipes,那里有一个多余的and。已删除,感谢您的关注。
【解决方案2】:

你也可以在 PHP 中做到这一点:

$result = [];
while (...) {
    .....

    $kn = ($count * 4) + (($num * 2) * 30);
    $result[] = [
        'rank' => $kn,
        'name' => $name
    ];
}

usort($result, function($a, $b) {
    return $b['rank'] - $a['rank'];
});

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2015-04-23
    • 2016-05-05
    • 2014-05-07
    • 2019-06-15
    相关资源
    最近更新 更多