Pergunta

No MySQL, posso usar a função rand (), existe alguma alternativa no sqlite 3?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top