Select random multi records

Poszukuję metody zwracającej losową liczbę rekordów (n) na ogólnej ich liczbie (s) s>n (oczywiście).

  1. Metoda ma być możliwie wydajna (będzie wywoływana na każdym przeładowaniu)
  2. ID rekordów nie są następujące po sobie
  3. Dobrze by było żeby wielkość liczby s nie była zmienną (bardzo) znaczącą dla wydajności metody
  4. mySql

moje pierwsze podejście było czysto ruby/rails, i oczywiście nie spełnia założeń, było takie:

@disp = Item.sort_a @show = [] 15.times do @show << @disp.delete(@disp.rand) end @show
Optymalizacji trzeba chyba szukać w zapytaniu sql.
Świadomy jestem istnienia rozwiązania opisanego tutaj: http://robzon.aenima.pl/2008/05/selecting-multiple-random-rows-from.html

czy ktoś ma jakieś inne pomysły ?

czyli przy każdym wywołaniu ilość pobieranych rekordów ma być inna jak rozumiem? czy jednak chodzi o liczbę n losowych rekordów?

n (liczba losowanych rekordów) ma być stała - w moim rozwiązaniu n = 15.

Ciężko Ci będzie znaleźć cokolwiek lepszego.

Item.find :all, :limit => 15, :order => 'rand()'

No dobra doczytałem w tych komentarzach, że to niby mało wydajne, ale jak nie masz za dużo rekordów to chyba najprostsze co może być

Zdefiniuj “za dużo” :stuck_out_tongue:
Generalnie każdy serwis, który ma osiągnąć niezerową popularność, powinien zapomnieć o order by rand().