2013-05-31 37 views
1

我在查詢中從50k行的數據庫中選擇100個隨機行時遇到了問題。RAND的多行替代方法()

首先,我只使用了函數RAND(),但它變得太慢了。

我現在用的這個查詢:

$query = mysql_query("SELECT t1.* FROM users AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM users WHERE picture != '' && age <= 50 && age >= 18 && username != '')) AS id) AS t2 WHERE picture != '' && age <= 50 && age >= 18 && username != '' && t1.id >= t2.id LIMIT 100"); 
while($q = mysql_fetch_assoc($query)) 
{ echo $q['id'].'<br>'; } 

但有時它給了一堆空行。

有人可以告訴我最新出錯嗎?

謝謝!

UPDATE我正在嘗試此查詢,但它給了我一個錯誤。

$query = mysql_query("SELECT id FLOOR(1 + RAND() * x.m_id) 'rand_ind' FROM users (SELECT MAX(t.id) - 1 'm_id' FROM users t) x WHERE picture != '' && age <= 50 && age >= 18 && username != '' ORDER BY rand_ind LIMIT 100"); 

mysql_fetch_assoc():提供的參數不是一個有效的MySQL結果資源

+0

以任意順序獲取所有行,然後使用PHP進行混洗(或從結果數組中取幾個隨機數)可能是正確的方法。 –

+0

@MadaraUchiha,當我們實際只需要100個時選擇50k行不是一個好主意 –

+1

@ v2p:沒有好好讀,我的壞,你說得對。 –

回答

-1

你可以使用:

SELECT ... FROM ... LIMIT $rand,100 

$rand是隨機生成的數字(0-50k)從代碼端

+2

不幸的是,只有第一項是隨機的,其餘的幾乎是隨機的。 –

+0

是的,100行的組是隨機的,不是每行 – Stephan

+0

反正如果限制是2000,100那麼接下來的100個用戶並不是所有的用戶都有我在''WHERE picture!=''中使用的過濾器&& age <= 50 && age> = 18 && username!=''「' – user2370950

1

如果您爲什麼不生成0到「max_rows」之間的x個隨機數字?

然後像做

'SELECT ... FROM .... WHERE ID in (' . implode(',', $randomNumbers) . ')';

將與生成的ID返回行。