2011-02-08 12 views

risposta

45

Errato. Non puoi ordinare per colonna (afaik) se vuoi che diventi casuale.

$query = 'SELECT * FROM gameids ORDER BY RAND() LIMIT 1'; 
+0

Non funziona con 'rand' -' rand() 'è una funzione. – Piskvor

+0

@Piskvor: ho riscritto la mia risposta. – Marwelln

+0

+1 per essere circa 30 secondi più veloce durante la digitazione! –

5

Non è necessario dire quale colonna randomizzare, ma avete bisogno () dopo RAND perché è una funzione.

SELECT 
    * 
FROM 
    gameids 
ORDER BY 
    RAND() 
LIMIT 1 
2

RAND è una funzione e non è efficace nelle grandi tabelle, perché non utilizzare gli indici.

$query = 'SELECT * FROM gameids ORDER BY RAND() LIMIT 1'; 

Una possibile soluzione è quella di aggiungere colonna chiamata random e su ogni record di generare numeri casuali per essa, poi, quando si sta interrogando il database, l'ordine da questa colonna e si otterrà pseudo-casuale, ma questa volta usando gli indici

$query = 'SELECT * FROM gameids ORDER BY timestamp, random LIMIT 1'; 

Edit: È anche possibile effettuare RAND() più "flessibile" mediante l'applicazione di qualche espressione come questo RAND() * MAX(numeric_column_name)

Se siete interessati a ottimizzazioni, dare un'occhiata a questo post sul blog: http://jan.kneschke.de/projects/mysql/order-by-rand/

@Marwelln è corretto.

+0

Bene, questo è un database molto grande c'è un modo per ottenere le righe totali e quindi generare un numero casuale da ordinare? – AndrewFerrara

+0

È innnoDB o MyISAM? Che tipo è la tua chiave primaria? Hai colonne solo con dati numerici? – ludesign