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

ORDERBY句と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

于 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 に答える