2010-11-06 17 views
39

W MySQL można wybrać X. losowe wierszy z następującym stwierdzeniem:Wybierz losowy wiersz (y) w SQLite

SELECT * FROM table ORDER BY RAND() LIMIT X 

Nie oznacza to jednak, praca w SQLite. Czy istnieje odpowiednik?

+0

jeden http://stackoverflow.com/questions/2279706/select-random-row-from-an-sqlite-table –

Odpowiedz

38

na znacznie lepszą wydajność użytku:

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

silniki SQL pierwszy ładunek prognozowanych pola wierszy na pamięć następnie posortować je, tutaj po prostu zrobić losowy sortuj pola id każdego wiersza, który jest w pamięci, ponieważ jest indeksowany, następnie oddziel je X i znajdź cały wiersz używając tych X identyfikatorów.

To zużywa mniej pamięci RAM i procesora, gdy tabela rośnie!

+0

Metoda 2 była znacznie ważniejsza niż przyjęta odpowiedź. Dzięki! –

+0

To wspaniałe dzięki, zaktualizowałem zaakceptowaną odpowiedź :) –

+0

WOW !! taki występ !!!! – Omid

53

SELECT * FROM table ORDER BY RANDOM() LIMIT X

+0

Dzięki, że to wystarczy –

+4

rekord: działa, ale na większych stołach jest wolny. Szybszy sposób (choć nie całkiem taki sam) byłby: 'WYBIERZ * Z tabeli WHERE random()% k = 0 LIMIT n;'. Wadą tego jest to, że rekordy z niższymi kluczami podstawowymi mają większą szansę na wybranie. [Zrobione stąd] (http://blog.rodolfocarvalho.net/2012/05/how-to-select-random-rows-from-sqlite.html) – ren

+2

Tak, będzie powolny na dużych stołach, ponieważ kończy się wymuszenie skanowania tabeli. Minusem chęci robienia takich rzeczy w SQL. Najlepszym sposobem byłoby wybranie losowych przesunięć w twoim przednim końcu. – Donnie

7
SELECT * FROM table ORDER BY RANDOM() LIMIT 1 
0

Wszystkie odpowiedzi tutaj są oparte na ORDER BY. Jest to nieefektywne (to jest bezużyteczne) dla dużych zestawów. Dlaczego nie po prostu umieścić abs(CAST(random() AS REAL))/9223372036854775808 < 0.5 w klauzuli WHERE, aby uzyskać w tym przypadku szansę na trafienie 0,5?

SELECT * 
FROM table 
WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5 

Duża liczba to maksymalna bezwzględna liczba, którą może wygenerować random(). Numer abs() jest podpisany. Rezultatem jest równomiernie rozłożona zmienna losowa z zakresu od 0 do 1.

Powiązane problemy