2015-04-28 62 views
2

所以我正在製作高分系統,用於我的統一遊戲,使用mysql,php。爲什麼這個php查詢不起作用?

爲了獲取存儲在DB的高分信息,我寫的一樣,(DB有「分數」,「名稱」一欄中,而不是「排名」列名)

$sql = "SELECT id, score, name, CASE\n" 
     . " WHEN @prev_value = score THEN @rank_count\n" 
     . " WHEN @prev_value := score THEN @rank_count := @rank_count + 1\n" 
     . "END AS rank\n" 
     . "FROM BBR\n" 
     . "ORDER BY score DESC LIMIT $min, $max"; 

$result = mysql_query($sql) or Die('Query failed: ' . mysql_error()); 

$info = ""; 
while($found = mysql_fetch_array($result)){ 
    $info = $info .'@'. $found['name'] .':'. $found['score'] .':'. $found['rank']; 
} 
echo $info; 

,團結,我收到此信息並分割到每個字符串。

string[] score = serverHighScores[x].Split(':');

但在比分[0](名)本工作,得分[1](評分)好,但在比分[2](秩)不工作。

爲什麼?我應該如何解決? 謝謝。


該查詢

SET @prev_value = NULL; 
SET @rank_count = 0; 
SELECT id, score, name, CASE 
    WHEN @prev_value = score THEN @rank_count 
    WHEN @prev_value := score THEN @rank_count := @rank_count + 1 
END AS rank 
FROM BBR 
ORDER BY score DESC 

,這工作得很好在phpMyAdmin SQL。

+0

在查詢中是否需要'\ n'? –

+0

@IswantoSan它只是PHP的字符串連接。與mysql無關。 – leegod

+0

嘗試打印'serverHighScores [x]'content –

回答

3

我會寫的查詢是這樣的:

SELECT b.id 
    , b.name 
    , @rank_cnt := IF(@prev_score = b.score,@rank_cnt,@rank_cnt+1) AS rank 
    , @prev_score := b.score AS score 
    FROM BBR b 
CROSS 
    JOIN (SELECT @rank_cnt := 0, @prev_score := NULL) i 
ORDER BY b.score DESC, b.id DESC 

注意:我們該查詢觀察行爲是保證。 MySQL參考手冊特別警告不要以這種方式使用用戶定義的變量。但是我們觀察到的行爲(至少在MySQL 5.1和5.5中)是一致的。

在比較之後完成@prev_score的賦值是很重要的,這就是爲什麼列按照它們的方式排列在SELECT列表中的原因。

我不認爲CASE表達式中的賦值(它在問題中的查詢方式)「按照我們預期的方式工作」。我認爲它與MySQL執行的操作順序有關。如上所示,我一直將表達式的結果分配給SELECT列表中的用戶定義變量。

表達IF(@prev_score = b.score,@rank_cnt,@rank_cnt+1)可以用等效CASE表達式替換:

CASE WHEN @prev_score = b.score THEN @rank_cnt ELSE @rank_cnt+1 END 

注意,表達式返回值,它沒有試圖做的一項任務。

我更喜歡在語句中初始化用戶定義的變量,而不依賴於單獨的SET語句。在這種情況下,我們並不關心內聯視圖i返回的內容,只是我們希望它只返回一行(因爲JOIN操作)......我們真的更感興趣的是內聯視圖查詢在之前得到物化外部查詢運行,以便外部查詢運行時變量被初始化。

另外,我向ORDER BY添加了另一個表達式,以便結果更具確定性。

...(添加鏈接到MySQL參考手冊的適用部分關於有關用戶定義的變量警告)


mysql_接口功能是棄用。改爲使用mysqliPDO接口。

+0

Thx長時間回覆。但我的問題是,爲什麼'排名'信息不會被上面的php代碼抓取? – leegod

+0

哦,謝謝!我只是跟着這個SQL查詢,和上面的PHP代碼可以獲取排名信息!並在團結中運作良好。 – leegod

+0

我在問題處張貼的原始查詢也可以在DB的phpmyAdmin的SQL中顯示'等級'列。問題在於上面的php代碼,$ found ['rank'];不工作。 – leegod