2010-09-28 108 views
2

我有以下查詢,我用它來在遊戲中返回的最高得分,但我想這是由空行來填充,如果有小於10個記錄:填充查詢結果與空行

SELECT id, MAX(score) mscore FROM scores WHERE id IN (".implode(',', $data).") GROUP BY id ORDER BY mscore DESC" 

邏輯是一個用戶ID數組將被傳遞給查詢,然後最高得分的ID將被排序,並且前十名將被形成,很多ID還沒有得分,因此一些前十名查詢返回只有3或4行。我如何填寫查詢結果,直到我有10個?該ID參考照片等。

+0

你爲什麼要在sql中這樣做,當你應該在腳本中這樣做? – stillstanding 2010-09-28 11:27:18

回答

2

像@Thariaman說(+1)不這樣做,在MySQL作爲它的更麻煩,更難在將來支持。

我會嘗試這樣的事情(填充空鍵排列,所以你如果你試圖訪問這些(或其它)腳本不會拋出警告)

function getMaxScores($gameid) { 

    $result = query("SELECT id, MAX(score) mscore FROM scores ". 
     "WHERE id IN (".implode(',', $data).")". 
     "GROUP BY id ORDER BY mscore DESC LIMIT 10" 
    ); 
    if(count($result) < 10) { 
     $result = array_pad($result, 10, array("id" => "", "mscore" => ""); 
    } 
    return $result; 
} 
+1

只是一件事,我需要數組來攜帶ID,如果分數是空的,那就好了,那就是爲什麼我認爲在sql中更容易 – 2010-09-28 12:12:20

-3

在MySQL中,您可以使用limit來選擇前10行。

SELECT id, MAX(score) mscore 
FROM scores 
WHERE id IN (".implode(',', $data).") 
GROUP BY 
     id 
ORDER BY 
     mscore DESC 
LIMIT 10 
4

不要在mysql中這樣做。 當您使用php來獲得結果集時,只需根據需要添加空結果即可。 (意味着空數組字段)

0
while($row = mysql_fetch_array($result)) 
{ 
    $data[] = $row; 
} 

然後,只需不斷增加空行,直到恰好孤單10個結果中的集。

while(count($data) <= 10) 
{ 
    $data[] = array(); 
} 

另一種選擇是在輸出時使用for循環和if語句,而不是foreach!

for($i=0; $i<=10; $i++) 
{ 
    if(isset($data[$i])) 
    { 
     //Show data from $data[$i] 
    }else 
    { 
     show block row. 
    } 
} 
0

雖然我同意,你應該處理這個在你的腳本,而不是查詢本身,來考慮的一件事是:

SELECT * FROM (
    (
    SELECT id, MAX(score) mscore FROM scores 
    WHERE id IN (1,4) GROUP BY id ORDER BY mscore DESC 
) 
    UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '') 
    UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '') 
    UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '') 
) as t LIMIT 10 

但是如果我在評論中見過這樣的代碼,開發者將獲得「澳RLY?」注;-)

0

我會創建一個默認(s)表與10行的基本默認數據。 然後用10個默認行的聯合來選擇你想要的記錄,如果你使用硬編碼或者在默認表上計數,那麼將輸出限制爲10。