6

您好,我有一个这样的查询:

    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
4

2 回答 2

9

您的 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在没有子句的子查询中使用bare 是没有意义的,LIMIT因为排序不一定保留在外部查询的结果中。

于 2012-12-10T08:51:07.973 回答
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
于 2014-11-26T04:36:30.333 回答