Domanda

In MySQL posso utilizzare la funzione RAND (), c'è qualche alternativa in SQLite 3?

È stato utile?

Soluzione

random () :

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top