2016-08-30 118 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']; 
});