2012-12-10 9 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()は動作していないようだと私は論理的なエラーを見つけることができないようです。

EDIT:問題を解決しました。 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を()'ひどく非効率的である - あなたは、おそらくしようとすると、別の解決策を見つける必要があります。それにもかかわらず、 '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 

それは裸を持ってしても意味がありませんLIMIT句のないサブクエリにはORDER BYが含まれているため、順序が外部クエリの結果に必ずしも保存されないためです。

+2

問題 は、RAND(BY ORDER(YAZILIM_menu_icerik menu_id = $ IDから、otel_id SELECT))0,20" を制限 、IN YAZILIM_menu_icerik.menu_id = 39、otel_id YAZILIM_menu_icerik FROM otel_id SELECT解決しました。 – FreshPro

4

ORDER BY RAND()は悪い解決策です。あなたのインデックスは無視されます。大量のデータを扱うと特に困難な状況。

は代替あなたがIDに主キーがある場合:RAND BY

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 
関連する問題