SQLITE - Ordem de Rand ()
-
12-09-2019 - |
Pergunta
No MySQL, posso usar a função rand (), existe alguma alternativa no sqlite 3?
Solução
usando aleatória():
SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
Editar (por QOP): Desde os documentos em SQLITE AutoinCrementAs colunas ED afirmam que:
O algoritmo normal de seleção de RowID descrito acima irá gerar o aumento monotonicamente rowids exclusivo Contanto que você nunca use o valor máximo do RowID e nunca exclua a entrada na tabela com o maior RowID. Se você excluir linhas, então Rowids de linhas excluídas anteriormente podem ser reutilizadas ao criar novas linhas.
O exposto acima só é verdade se você não tiver um INTEGER PRIMARY KEY AUTOINCREMENT
coluna (ainda funcionará bem com INTEGER PRIMARY KEY
colunas). 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 da linha interna sqlite.
Outras dicas
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 corre mais rápido porque Motores SQL Primeira carga de campos projetados de linhas para a memória e classificá -los, aqui apenas carregamos e classificamos aleatório o campo de identificação das linhas, depois obtemos X delas e encontramos todas as linhas desses X IDs, que são indexados por padrão.