2012-12-10 13 views
6

Ciao Ho una domanda come questa:mysql RAND() LIMITE

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 

Si deve visualizzare in modo casuale 20 hotel ogni volta funziona, ma, invece, sto finendo ottenere lo stesso 20 hotel di volta in volta. La lunga storia breve RAND() non sembra funzionare e non riesco a trovare alcun errore logico.

MODIFICA: problema risolto. Mysql non vede RAND interno() ecco il modo corretto per farlo:

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()' è terribilmente inefficiente - probabilmente si dovrebbe cercare di trovare un'altra soluzione. Indipendentemente da ciò, se sposti 'ORDER BY RAND()' all'esterno di ')', funziona? – Swadq

risposta

7

tuo ORDER BY e le clausole limite dovrebbe essere insieme:

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 

Non ha senso avere una nuda ORDER BY in una sottoquery senza clausola LIMIT perché l'ordine non è necessariamente conservato nei risultati della query esterna.

+2

Problema risolto SELEZIONA otel_id FROM WHERE YAZILIM_menu_icerik YAZILIM_menu_icerik.menu_id = 39 E otel_id IN (SELECT otel_id FROM WHERE YAZILIM_menu_icerik menu_id = $ id) ORDER BY RAND() Limite 0,20" ; – FreshPro

4

ORDINA DA RAND() è una soluzione sbagliata. I tuoi indici sono ignorati. Situazione particolarmente difficile con grandi quantità di dati.

alternativa, se si dispone di chiave primaria 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 
Problemi correlati