2016-08-30 93 views
2

我正在做一个排名系统。但我想要的是将结果从最高到最低排序($kn)。我怎样才能做到这一点?订单while循环数据

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'; 
} 
+4

哪个查询? 'SELECT * FROM ranking WHERE name ='$ name'ORDER BY rank DESC'假设有一个名为'rank'的列。 http://dev.mysql.com/doc/refman/5.7/en/sorting-rows.html – AbraCadaver

+0

我要按$ kn的值排序 – Hazelcraft

回答

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中,但这不是问题的关键,我不想增加额外的混淆。

+0

此查询没有意义(组1行) SELECT name ,COUNT(*)AS cnt_submitted FROM submitted WHERE id ='$ id'AND pending ='Accept'AND GROUP BY name –

+0

@AndrejLudinovskov yipes,在那里有一个冗余的'和'。删除它,感谢您的注意。 – Mureinik

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