SQLite – ORDER BY RAND ()

No MySQL eu posso usar a function RAND (), existe alguma alternativa no SQLite 3?

usando random () :

SELECT foo FROM bar WHERE id >= (abs(random()) % (SELECT max(id) FROM bar)) LIMIT 1; 

EDIT (por QOP): Como os documentos nas colunas SQLin Autoincrement ed afirmam que:

O algoritmo de seleção ROWID normal descrito acima gerará ROWIDs únicos de aumento monotônico , desde que você nunca use o valor máximo de ROWID e nunca exclua a input na tabela com o maior ROWID. Se você excluir linhas, os ROWIDs de linhas excluídas anteriormente poderão ser reutilizados durante a criação de novas linhas .

O acima só é verdadeiro se você não tiver uma coluna INTEGER PRIMARY KEY AUTOINCREMENT (ela ainda funcionará bem com as colunas INTEGER PRIMARY KEY ). De qualquer forma, isso deve ser mais portátil / confiável:

 SELECT foo FROM bar WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar)) LIMIT 1; 

ROWID , _ROWID_ e OID são todos os aliases para o ID de linha interno do SQLite.

 SELECT * FROM table ORDER BY RANDOM() LIMIT 1; 

Resolvido:

 SELECT * FROM table ORDER BY RANDOM() LIMIT 1; 

Para um desempenho muito melhor, use isso no SQLite:

 SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x) 

Isso também é aplicável ao MySQL. Isso é executado mais rápido porque os mecanismos SQL primeiro carregam campos projetados de linhas na memory e os classificam , aqui apenas carregamos e classificamos aleatoriamente o campo id das linhas, então obtemos X deles e encontramos as linhas inteiras desses IDs X que são padrão indexado.