Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] Wybieranie losowych rekordów + LIMIT
jg44
post
Post #1





Grupa: Zarejestrowani
Postów: 122
Pomógł: 14
Dołączył: 14.07.2011
Skąd: Gliwice / Wrocław

Ostrzeżenie: (0%)
-----


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?

Ten post edytował jg44 24.11.2011, 20:07:40
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
uupah5
post
Post #2





Grupa: Zarejestrowani
Postów: 207
Pomógł: 18
Dołączył: 4.09.2010
Skąd: warszawa

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
jg44
post
Post #3





Grupa: Zarejestrowani
Postów: 122
Pomógł: 14
Dołączył: 14.07.2011
Skąd: Gliwice / Wrocław

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




  1. SELECT * FROM (SELECT * FROM TABELA ORDER BY ID ASC LIMIT 4) AS al ORDER BY RAND()


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jg44
post
Post #5





Grupa: Zarejestrowani
Postów: 122
Pomógł: 14
Dołączył: 14.07.2011
Skąd: Gliwice / Wrocław

Ostrzeżenie: (0%)
-----


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...

Ten post edytował jg44 25.11.2011, 16:17:24
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 02:05