2012-12-10 115 views
6

你好,我有這樣的查詢:MySQL的RAND()LIMIT

SELECT otel_id 
     FROM YAZILIM_menu_icerik 
     WHERE YAZILIM_menu_icerik.menu_id = 39 
     AND otel_id IN (
         SELECT otel_id 
         FROM YAZILIM_menu_icerik 
         WHERE menu_id =$id 
         ORDER BY RAND() 
         ) 
     LIMIT 0,20 

應該隨機顯示20家每次工作時間,但相反,我結束了每次都得到同樣的20家酒店。長話短說RAND()似乎不工作,我似乎無法找到任何邏輯錯誤。

編輯:問題解決了。 MySQL不看內RAND(),所以這裏是正確的方式做到這一點:

SELECT otel_id 
    FROM YAZILIM_menu_icerik 
    WHERE YAZILIM_menu_icerik.menu_id = 39 
    AND otel_id IN (
        SELECT otel_id 
        FROM YAZILIM_menu_icerik 
        WHERE menu_id =$id 
        ) 
ORDER BY RAND() 
LIMIT 0,20 
+1

'ORDER BY RAND()'是非常低效的 - 你也許應該嘗試找到另一種解決方案。無論如何,如果你將'ORDER BY RAND()'移到''''外部,它是否工作? – Swadq

回答

7

你的ORDER BY和LIMIT子句應該在一起:

SELECT otel_id 
FROM YAZILIM_menu_icerik 
WHERE YAZILIM_menu_icerik.menu_id = 39 
AND otel_id IN 
(
    SELECT otel_id 
    FROM YAZILIM_menu_icerik 
    WHERE menu_id = $id 
) 
ORDER BY RAND() 
LIMIT 20 

這是沒有意義的有裸ORDER BY在沒有LIMIT子句的子查詢中,因爲排序不一定保留在外部查詢的結果中。

+2

問題解決 SELECT otel_id FROM YAZILIM_menu_icerik WHERE YAZILIM_menu_icerik.menu_id = 39和otel_id IN (SELECT otel_id FROM YAZILIM_menu_icerik WHERE menu_id = $ ID)ORDER BY RAND()LIMIT 0,20" ; – FreshPro

4

ORDER BY RAND()是不好的解決方案。您的索引被忽略。具有大量數據的特別困難的情況。

,如果你有ID主鍵替代:

SELECT b1.* FROM Bugs AS b1 JOIN 
(SELECT CEIL(RAND()* (SELECT MAX(id) FROM Bugs)) AS id) AS b2 
WHERE b1.id >= b2.id ORDER BY b1.id LIMIT 1