2014-09-25 93 views
1

我想從表中隨機抽出3條記錄,然後將它們排序到「sponsor_ranking」字段。我可以訂購隨機結果嗎?

我的代碼閱讀。

$sql = "SELECT * FROM $TableSponsors ORDER BY RAND(), sponsor_ranking asc LIMIT 3"; 

但它沒有按照「sponsor_ranking」的順序排序結果,但它是隨機化結果。

有什麼建議嗎?

謝謝。

回答

2

當然,如果每個記錄具有相同的RAND()值,那麼按sponsor_ranking進行排序纔有用,因爲該值不太可能。

你可以這樣解決。隨機排列,限制爲3個,由sponsor_ranking再次排列。

SELECT * FROM 
    (SELECT * FROM $TableSponsors 
    ORDER BY RAND() 
    LIMIT 3) x 
ORDER BY 
    sponsor_ranking 
+1

謝謝你..你的這個解決方案可以完美運行。 – Cavemanharris 2014-09-25 14:53:09

+0

[不客氣](http://stackoverflow.com/help/someone-answers):) – GolezTrol 2014-09-25 16:36:17

0

你可以做在一個子表的條款:

$sql = "SELECT * FROM (SELECT * FROM $TableSponsors ORDER BY RAND() LIMIT 3) Faketable ORDER BY sponsor_ranking"; 
0

這不會有任何效果。使用多個字段做order by要求「更早」的字段對於第二個和後續字段具有相同的值,以便被考慮。

你必須使用子查詢做蘭特()排序,然後在父查詢其他領域排名:

SELECT * 
FROM (
    SELECT * 
    FROM $TableSponsors 
    ORDER BY RAND() 
) as foo 
ORDER BY sponsor_ranking 
LIMIT 3 

例如如果你的表有這樣的:

x y 
1 5 
1 6 
2 7 
3 8 
4 9 

... ORDER BY x DESC, y ASC 

,那麼你會得到

x y 
4 9 // only one "4", so 9 is ignored, no point in sorting a single value 
3 8 // only one "3", so 8 is ignored, no point in sorting a single value 
2 7 // ditto 
1 5 // hey, there's two "1" values, so now the second field **IS** sorted 
1 6 
+0

我覺得這個答案是錯誤的。 ORDER BY RAND現在不做任何事情。您只需通過「sponsor_ranking」訂購併獲得前三名。 – GolezTrol 2014-09-25 14:33:58