簡體   English   中英

隨機且唯一的Mysql選擇查詢

[英]Random and unique Mysql select query

Mysql數據庫中充滿了約90個圖像鏈接。 但是,每行的ID並非真正按時間順序排列。 例如,最初從6到20,然后有一個缺口,我刪除了一些缺口。 然后從80到120,再到另一個差距。

這是一個熱門或不熱門的網站。 我希望用戶能夠瀏覽所有90張圖像,而不必兩次查看同一張圖像。 但是,此刻每時每刻都在發生。 同一張圖片出現兩次或什至三次。

這是我現在的選擇查詢:

$sql = mysql_query("SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `content`)  ORDER BY rand() LIMIT 1");

有誰知道這個問題更好的解決方案?

您可以存儲用戶已看到的“事物”的ID,並將其排除在所有接下來的頁面中(通過聯接或不在其中)。 這樣,您總是可以得到一個隨機的帖子,而不會陷入數據庫中行的順序的困擾(如果用戶稍后返回該怎么辦?)。

如何從數據庫中獲取所有索引,對其進行混排,創建列表,然后將它們從一頁傳遞到另一頁,顯示最上面的索引並將其從列表中刪除,該怎么辦?

您面臨的問題是rand()本身存在的問題。 每次您調用它時,它都會產生不同的順序。 隨機是隨機的,因此給定的行可能連續出現兩次。 您真正要尋找的是隨機排列。

一種方法是隨機植入種子,然后加上偏移量limit

select *
from table t
order by rand(<seed value here>)
limit <offset>, 1;

您需要的兩件事是種子值。 您可以通過僅保留每個用戶的枚舉值或使用用戶ID或每個用戶的整數和常數的方式來執行此操作。

您需要的另一件事是偏移量。 這很重要,因為獲得第二個項目時,需要確保訂購順序與第一個項目相同。

另一種方法是第一次以隨機順序獲取所有id,並將其存儲在應用程序中。 您可以使用group_concat()做到這一點:

select group_concat(id order by rand())
from table t;

然后遍歷此列表,而不是返回數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM