2013-06-04 115 views
0
 
id | photo title  | created_date 

33 | my family  | 2009 8 04 
44 | friends group | 2009 4 05 
55 | beautiful place | 2009 3 06 
66 | working late | 2009 11 07 

我隨機我的結果,並限制爲1。說我有編號55。我怎麼會得到下一行而沒有得到我再次得到的結果?隨機隨機沒有得到相同的結果再

這是網頁

SELECT * FROM數據ORDER BY RAND()LIMIT 1

在接下來的頁面我可能會再次相同的結果

查詢

SELECT * FROM data WHERE id> $ n ORDER BY rand()LIMIT 1

+0

您可以通過'$ _SESSION'將查詢結果傳遞給另一個頁面 – Robert

+2

如果數據庫變大,會話可能會太大 – Nathaniel

回答

3

重新使用您在PHP中生成的種子。

僞代碼:

$seed = rand() 
$stmt = $mysqli->prepare("SELECT * FROM data ORDER BY RAND(?) LIMIT 1"); 
$stmt->bind_param($seed); 
$stmt->execute() 
... 

然後當你需要行的其餘部分:

$stmt = $mysqli->prepare("SELECT * FROM data ORDER BY RAND(?) LIMIT 2,1000"); 
$stmt->bind_param($seed); 
$stmt->execute() 
... 

查看更多有關在the mysql manual播種RAND()

這種方法的優點是,您可以顯示任意數量的頁面,而無需跟蹤除最初生成的種子(以及當然是哪個頁面)上的任何內容。

0

你沒有寫你使用的引擎。假設它是pdo,你可以在結果上使用fetchAll(),並通過$ _SESSION將fetchAll()的結果傳遞給會話。

$sth = $dbh->prepare("SELECT * FROM data ORDER BY rand() "); 
$sth->execute(); 
$_SESSION['rnd_res'] = $sth->fetchAll(); 

如果你寫LIMIT 1將不會有其他記錄只有一個。您還可以記得的最後一ID或ID的團體和寫

SELECT * FROM data WHERE id<>$last_id ORDER BY rand() 

這將排除上次使用的ID,這個ID可以存儲在$_SESSION爲好。

查詢結果組的最後一個選項可能是NOT IN();

SELECT * FROM data WHERE id NOT IN($array_of_last_ids) ORDER BY rand() 
+1

我希望我們都可以假設每個人都使用PDO:P – Lix

+0

我沒有使用POD,只是PHP和MySQL :( – Nathaniel

+1

PDO是一個連接數據庫例如MySQL的PHP​​引擎。@Lix我也希望; P – Robert

0

好,其中一個方案是提供您在已選擇的結果where子句:

SELECT * FROM data WHERE `id` NOT IN ('the', 'ids', 'you', 'already', 'selected', ...) ORDER BY rand() LIMIT 1 

但是這種方法會相當迅速變得效率低下,因爲越來越多的「使用的ID」得到添加到NOT IN列表中。處理隨機結果時,這總是一個問題。

您可能需要考慮將使用的ID值存儲在單獨的表中,並使用該表的內容(可能由user_id索引)來指定已使用的結果。