Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Wybieranie losowych rekordów + LIMIT
Forum PHP.pl > Forum > Przedszkole
jg44
Witam,
w jaki sposób mogę wybrać z tabeli losowe rekordy z określonego przedziału?
Przykładowo, takie coś:
  1. SELECT * FROM tabela WHERE nazwa='$this->name' ORDER BY RAND() LIMIT 0,4

wcale nie zwróci w losowej kolejności 4 rekordów, tylko zwraca w losowej kolejności wszystko, co jest w tabeli...

Z drugiej strony takie coś:
  1. SELECT * FROM tabela WHERE nazwa='$this->name' ORDER BY id DESC LIMIT 0,4

działa idealnie, zwraca 4 rekordy posortowane malejąco.
Jak więc zrobić, żeby dla ORDER BY RAND() również zwróciło 4 rekordy?
uupah5
jedna i druga opcja powinna zwracać 4 rekordy.
jeśli nie zwraca, sprawdź samo limit 4. jeśli dalej nic, to nie wiem - u mnie działa i to odkąd pamiętam (wczesna wersja 4)
jg44
Nie do końca jasno się wyraziłem. Fakt, obie opcje zwracają po 4 rekordy, ale mi chodzi o to, że mam tabelę, w niej powiedzmy 10 rekordów i chcę 4 pierwsze rekordy wyrzucić w kolejności losowej - tutaj obie te opcje zawodzą.
Nie jestem pewien, czy to w ogóle da się zrobić za pomocą zapytania?
nospor
  1. SELECT * FROM (SELECT * FROM TABELA ORDER BY ID ASC LIMIT 4) AS al ORDER BY RAND()
jg44
Super, dziękuję bardzo! smile.gif

Przy okazji chciałbym zapytać jeszcze o jedną rzecz i żeby nie śmiecić, nie zakładać nowego tematu wink.gif
Mając te wylosowane rekordy, chciałbym je wstawić do innej tabeli (właściwie to update'ować). Problem polega na tym, że mam tabelę, w której są już jakieś 4 rekordy, i do każdego po kolei z nich wrzucić to, co zwróci w/w zapytanie. Jak można to zrobić? UPDATE nie przewiduje wrzucania 'hurtowej' ilości rekordów, tylko każe pojedynczo, a to delikatnie mówiąc nie jest zbyt wygodne, bo liczba update'owanych rekordów w przyszłości będzie się zmieniać (teraz jest to 4, a kiedyś może to być np. 27, itd. ...)

Próbowałem tak:
  1. $max = 8;
  2. $min = 4;
  3. for ($i=$max; $i>=4; $i--)
  4. {
  5. mysql_query("UPDATE tabela1 SET kolumna1=(SELECT kolumna2 FROM
  6. (SELECT kolumna2,kolumna3 FROM tabela2 WHERE nazwa='$this->name ORDER BY ID ASC LIMIT $i,1)
  7. AS x ORDER BY RAND()) WHERE nazwa='$this->name'")or die(mysql_error());
  8. }

Co prawda to się wykonuje, ale niestety źle, bo podzapytanie wyciąga tylko jeden rekord z tabeli 'tabela2' i update'uje go we wszystkich kolejnych rekordach w tabeli 'tabela1', zamiast wyciągać wszystkie...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.