2015-09-04 47 views
2

我想獲得用戶對錶中每個統計「列」的單一排名。我試圖更有效地做到這一點,因爲我知道你可以。如何使用PHP函數獲得表中多列的排名更有效

所以我有一個名爲userstats的表。在那個表中我有3列user_id,stat_1,stat_2和stat_3。我想讓我能夠獲得相關user_id的每個屬性的排名。與我目前的代碼下面我將不得不復制代碼3倍,並更改列名以獲得我的結果。請看下面的例子。謝謝!

這是我目前如何獲得等級爲用戶

$ rankstat1 = getUserRank($用戶ID);

<code> 
function getUserRank($userid){ 

    $sql  = "SELECT * FROM ".DB_USERSTATS." ORDER BY stat_1 DESC"; 
    $result = mysql_query($sql); 
    $rows = ''; 

    $data = array(); 
    if (!empty($result)) 
     $rows  = mysql_num_rows($result); 
    else 
     $rows  = ''; 

    if (!empty($rows)){ 
     while ($rows = mysql_fetch_assoc($result)){ 
       $data[] = $rows; 
     } 
    } 

    $rank = 1; 
    foreach($data as $item){ 
     if ($item['user_id'] == $userid){ 
      return $rank; 
     } 
     ++$rank; 
    } 
    return 1; 
} 
</code> 

我相信這是我的方式來獲得我需要的是這樣,但我不能讓它的工作。

$ rankstat1 = getUserRank($ userid,'stat_1'); $ rankstat2 = getUserRank($ userid,'stat_2'); $ rankstat3 = getUserRank($ userid, 'stat_3');

+0

這裏的前提是錯誤的。你不想查詢數據庫來獲得每個等級(即你不想每個用戶調用你的getUserRank函數3次)。調用一次,然後解析結果以獲得所需的特定屬性。另外,避免SELECT *。在查詢中指定所需的列名稱。 –

回答

0

您可以使用一個查詢獲取所有的統計行列,而無需執行所有的PHP循環和檢查。

我已經使用PDO在這個例子中,因爲在查詢中使用的$userid變量需要的價值,並棄用的mysql數據庫擴展不支持預處理語句,它應該被用來減少SQL注入的風險。

如果必須使用該功能,則可以調整該功能以使用與mysqli相同的查詢,或者甚至使用mysql

function getUserRanks($userid, $pdo) { 
    $sql = "SELECT 
     COUNT(DISTINCT s1.user_id) + 1 AS stat_1_rank, 
     COUNT(DISTINCT s2.user_id) + 1 AS stat_2_rank, 
     COUNT(DISTINCT s3.user_id) + 1 AS stat_3_rank 
    FROM user_stats f 
     LEFT JOIN user_stats s1 ON f.stat_1 < s1.stat_1 
     LEFT JOIN user_stats s2 ON f.stat_2 < s2.stat_2 
     LEFT JOIN user_stats s3 ON f.stat_3 < s3.stat_3 
    WHERE f.user_id = ?" 

    $stmt = $pdo->prepare($sql); 
    $stmt->bindValue(1, $userid); 
    $stmt->execute(); 
    $ranks = $stmt->fetchObject(); 
    return $ranks; 
} 

這應該返回一個對象,其中包含給定用戶對每個屬性的等級的屬性。使用此功能的示例:

$pdo = new PDO($dsn, $user, $pw); 
$ranks = getUserRanks(3, $pdo);  // get the stat ranks for user 3 
echo $ranks->stat_2_rank;   // show user 3's rank for stat 2 
+0

」;「缺少WHERE f.user_id =?「|但是我把用戶ID放在」?「我是如何放置問號的?我沒有得到任何東西要返回這個錯誤」試圖獲得非對象線性:77的屬性「 –

0
$sql  = "SELECT user_id, stat_1, stat_2, stat_3 FROM ".DB_USERSTATS." ORDER BY stat_1 DESC"; 

而且,除非是有原因的,你需要的所有用戶的結果,限制查詢使用WHERE子句所以你只得到你真正需要的結果。

假設你限制你的sql查詢只有一個用戶,這將得到該用戶的統計信息。

foreach($data as $item){ 
    $stat_1 = $item['stat_1']; 
    $stat_2 = $item['stat_2']; 
    $stat_3 = $item['stat_3']; 
} 

如果你得到一個以上的用戶與您的SQL查詢的統計,考慮通過您的$ data數組返回給調用函數並遍歷數組以匹配用戶統計到特定用戶ID。

+0

什麼都沒有返回:/ –

+0

你能夠在phpmyadmin或任何你使用的mysql查詢工具中運行sql嗎?我相信「 –

相關問題