2012-12-10 58 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