2016-11-11 82 views
1

我想寫一個PHP腳本,它將從MYSQL表中隨機抽取一行。到目前爲止,代碼成功抓取了一個隨機行,但有時它不會返回任何內容,我不明白爲什麼。PHP&MYSQL - ORDER BY ID有時不會返回任何東西

$result = $conn->query("SELECT fact 
         FROM numfacts 
         WHERE number = '".(string)$number."' 
          AND id >= (SELECT FLOOR(MAX(id) * RAND()) FROM numfacts) 
         ORDER BY id 
         LIMIT 1"); 

$number該值爲當前12,並且有包含該數據庫中的兩行。大致2/3的代碼返回一個值,另外1/3的時間返回0結果。

如果您需要更多代碼,我會提供。

+0

'ORDER BY ID遞減或ORDER BY ID asc'什麼? – Cyclonecode

回答

0

WHERE子句部分id >= (SELECT FLOOR(MAX(id) * RAND()) FROM numfacts)限制查詢查看錶的子集。如果number = 12的兩行不在此子集中,則查詢不會返回任何內容。並且由於子集是隨機指定的,所以這隻會在某些時候發生。

要確保子集包含至少一個包含number = 12的行,可以在子查詢中包含該條件。

SELECT fact 
FROM numfacts 
WHERE number = '".(string)$number."' 
    AND id >= (SELECT FLOOR(MAX(id) * RAND()) 
       FROM numfacts 
       WHERE number = '$number') 
ORDER BY id 
LIMIT 1 

請注意,此查詢不提供非常公平的行選擇。因爲它使用ORDER BY id,所以偏向於低編號的行。這種方法是合理的,當你試圖選擇一個沒有其他過濾器的隨機行時,但是當你添加number = 12標準時,它變得不公平。例如,如果兩行的ID是50和75,那麼您將選擇較低的2/3的時間。

你可以得到一個公正的選擇:

SELECT fact 
FROM numfacts 
WHERE number = '$number' 
ORDER BY RAND() 
LIMIT 1 
+0

我看,有沒有其他方法可以得到更無偏見的隨機? – ashjack

+0

使用'SELECT ... ORDER BY RAND()LIMIT 1' – Barmar

0

如果子查詢SELECT FLOOR(MAX(id) * RAND()) FROM numfacts將返回小於$number的東西,則整個查詢將不返回任何內容。

+0

查詢從不將該隨機數與'$ number'進行比較。 – Barmar

+0

我的不好,條件是有'號碼'和'id'。你的答案更加清晰。 – Yaroslav