2011-12-02 91 views
2

我想顯示最新的三個新項目中的一個選擇最後三個項目之一。我想出了以下查詢:隨機從一個MySQL表

SELECT 
    * 
FROM 
    News 
WHERE 
    Id IN (
     SELECT 
      Id 
     FROM 
      News 
     WHERE 
      Display=1 
     ORDER BY 
      Published DESC 
     LIMIT 3 
    ) 
ORDER BY 
    RAND() 
LIMIT 1 

我預計,這將是可怕的效率低下,而且會工作。事實上,它並不:

錯誤查詢(1235):該版本的MySQL還不支持 'LIMIT & IN/ALL/ANY/SOME子查詢'

所以我實際的問題是,有什麼方法可以從表中最後三項中隨機選擇一項?

mysql> SHOW VARIABLES LIKE "%version%"; 
+-------------------------+-------------------------+ 
| Variable_name   | Value     | 
+-------------------------+-------------------------+ 
| innodb_version   | 5.6.28     | 
| protocol_version  | 10      | 
| slave_type_conversions |       | 
| version     | 5.6.28-0ubuntu0.15.10.1 | 
| version_comment   | (Ubuntu)    | 
| version_compile_machine | x86_64     | 
| version_compile_os  | debian-linux-gnu  | 
+-------------------------+-------------------------+ 
7 rows in set (0.00 sec) 
+1

哪個版本的MySQL是** **你使用? – ManseUK

+1

[從最後20條記錄中返回隨機5條記錄]的可能重複(http://stackoverflow.com/questions/6945784/return-random-5-records-from-last-20-records) – ajreal

回答

1

我發現類似的問題,如果你是指here

您必須創建一個臨時表,然後在從隨機選擇一個行。在你的情況將是:

SELECT * FROM (
    SELECT * FROM `News` WHERE `Display` = `1` 
ORDER BY `Published` DESC LIMIT 3 
) AS temptable 
ORDER BY RAND() 
LIMIT 1 

如前所說,它可能是一個好主意,選擇最後10和服務器端代碼選擇一個隨機。

0

錯誤意味着MySQL不支持的格式如下語句:

SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1) 

參考MySQL文檔here

2

儘量避免ORDER BY RAND()。更好的方法是從數據庫中獲取最新的三個條目。然後在服務器端代碼中隨機選擇一個。

-1

編程也正在尋找解決方法你堅持的東西太複雜的時候。 :)

這是當你想說外語類似的東西和你錯過一個字,所以你說,否則。

在這裏你可以得到3的最新消息,放在一個表並選擇一個隨機的消息。

如果您在PHP代碼,看看array_rand()