SQLite - ORDER BY RAND ()
-
12-09-2019 - |
Domanda
In MySQL posso utilizzare la funzione RAND (), c'è qualche alternativa in SQLite 3?
Soluzione
SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
Modifica (per QOP): Dal momento che la documentazione sul SQLite autoincremento colonne ED afferma che:
Il normale algoritmo di selezione ROWID descritto sopra genererà monotona crescente ROWIDs unici finché non si utilizza mai la valore massimo ROWID e non avete mai eliminare la voce nella tabella con il più grande ROWID. Se mai eliminare righe, poi ROWIDs da in precedenza le righe eliminate potrebbero essere riutilizzati per la creazione di nuove righe .
È possibile che questo è vero solo se non si dispone di una colonna INTEGER PRIMARY KEY AUTOINCREMENT
(sarà ancora funzionare bene con colonne INTEGER PRIMARY KEY
). In ogni caso, questo dovrebbe essere più portabile / affidabile:
SELECT foo FROM bar
WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;
ROWID
, _ROWID_
e OID
sono tutti alias del SQLite fila id interno.
Altri suggerimenti
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
Risolto:
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
Per un migliore utilizzo delle prestazioni in questo SQLite:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
Questo è applicabile anche a MySQL. Questo è più veloce perché motori SQL primo carico campi di righe in memoria proiettata poi ordinarli , qui dobbiamo solo caricare e ordinare a caso il campo id di righe, allora otteniamo X di loro, e trovare le intere file di questi X ids che è predefinita indicizzata.