Ricordo di aver letto da qualche parte che l'ordine di rand() è sbagliato e ho appena iniziato a trovarlo e ho trovato un articolo che lo dimostra. Order by rand() può essere estremamente lento con database di grandi dimensioni e la soluzione suggerita era quella di generare un numero casuale in php e selezionare in base ad esso. Il problema è che ho bisogno di verificare altri campi per restituire i miei record. Potrei anche aver cancellato alcuni vecchi record, che potrebbero anche causare un problema. Qualcuno può fornire un modo decente per selezionare alcuni record casuali da una tabella che corrisponde a determinate condizioni (ad esempio il campo paid
deve essere uguale a 1)?Restituisce risultati casuali (ordine by rand())
risposta
Quanto casuali avete bisogno che siano? se non avete bisogno di un super distribuzione uniforme provare questo
select min(pk_id) from my_table where pk_id > %(random_number)s and paid=1
dove %(random_number)s
è una variabile bind contenente un numero casuale 0
-max(pk_id)-1
rigenerato ogni volta che si esegue la query
Questa è una buona idea, ma non posso permettermi di rischiare di mostrare lo stesso insieme di risultati numerose volte. Questo dirà solo alle persone che ho un brutto sistema randomizzante. + rep though –
@php_nub_qq sarà ogni volta un record diverso se si genera un nuovo numero casuale ogni volta che si esegue la query – cmd
Sì, lo so, ma ho bisogno di restituire da 2 a 8 record, a cui mi riferisco come un set, e se il numero casuale deve essere max (pk_id) -8 (che imposterò come numero massimo di rand), verranno visualizzati sempre pk_id-7 e pk_id-6. E se 8 è il numero di record che ho bisogno di restituire l'ultimo 8 sarà sempre consecutivo. Non voglio eseguire 8 query separate –
La ragione per cui l'ordinazione da RAND()
può essere lento è che stai forzando il database a ordinare effettivamente l'intera tabella prima di restituire qualsiasi cosa. Basta ridurre il carico su una singola scansione della tabella è molto più veloce (anche se ancora un po 'lento).
Questo significa che si potrebbe ottenere un pezzo di strada semplicemente evitando l'ordine:
SELECT *
FROM my_table
WHERE RAND() < 0.1
ORDER BY RAND()
LIMIT 100
Questo selezionerà circa l'1% di tutte le righe della tabella, ordinarli e restituire il top 100. Proprio nota che il problema principale qui (così come con la risposta di @ cmd) è che non puoi essere sicuro che la query restituisca qualcosa.
L'approccio sopra dovrebbe comportare un'intera scansione della tabella (per decidere quali righe utilizzare) seguita da una sorta di circa l'1% delle righe. Se hai molte righe, puoi ridurre la percentuale di conseguenza.
Ho bisogno di essere sicuro che restituirò qualcosa e ho bisogno di essere sicuro che i record restituiti siano completamente casuali. Se non esiste un'opzione migliore, vorrei utilizzare il suggerimento di @ cmd ed eseguire alcune query in più. –
Ma il suggerimento di @ cmd ha la stessa debolezza: non puoi essere sicuro che restituirà qualcosa. – mzedeler
Perché no? Non vedo come potrebbe non restituire nulla. –
- 1. ORDER BY RAND() alternativa
- 2. MySQL: Alternative a ORDER BY RAND()
- 3. SQLite - ORDER BY RAND()
- 4. Caffe net.predict() restituisce risultati casuali (GoogleNet)
- 5. utilizzando rand per generare numeri casuali
- 6. Come selezionare la colonna ORDER BY e RAND() entrambi?
- 7. MySQL selezionare GROUP BY ordine
- 8. PHP rand() ... ottieni risultati 50/50 veri?
- 9. Difficoltà con pacchetto Go Rand
- 10. PHP - Is rand (1,1000) = 1000 come probabile come rand (1,1000) = rand (1,1000)?
- 11. Ordina per rand() in yii2
- 12. "group by" garantisce automaticamente "ordine per"?
- 13. Come posso generare numeri casuali senza funzione rand()?
- 14. Come ottenere risultati casuali da Microsoft Z3?
- 15. std :: uniform_real_distribution e rand()
- 16. replace rand() con openssl_random_pseudo_bytes()
- 17. SQL LIMIT non restituisce risultati dove nessun LIMIT restituisce risultati
- 18. System.Globalization.Calendar.GetWeekOfYear() restituisce risultati dispari
- 19. Celery non restituisce risultati
- 20. MonadParallel Instance for Rand
- 21. Risultati alternano con clausola ORDER BY
- 22. PHP rand() escludere certi numeri
- 23. Perché host_statistics64() restituisce risultati incoerenti?
- 24. rand() restituisce sempre la stessa sequenza sull'applicazione riavvio
- 25. NSDictionary allKeys - restituisce sempre lo stesso ordine?
- 26. mysql RAND() LIMITE
- 27. ORDER BY a seconda dei risultati dei parametri per errore
- 28. Android SQLite ORDER BY non funziona
- 29. Raggruppa per valore RAND()
- 30. Ottieni record casuali con Doctrine
se si utilizza php, utilizzare la funzione 'shuffle'. quindi ottieni i tuoi risultati e poi mescolali nel tuo programma. –
Ma cosa succede se ho restituito 100.000 risultati, non voglio recuperare tutto ciò che –
@FabianBigler tirando un numero elevato di risultati in php per ottenere solo pochi è probabile che sia molto più lento del limite "order by rand()" N'. – Kevin