Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> losowe pobieranie jednego z 10 rekordów
zdzichu
post
Post #1





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 28.08.2006

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


...w oczekiwaniu na rozwiązanie mojego głównego problemu z sql postanowiłem się wziąć za coś innego.
chciałbym pobrać losowo, jeden z 10 ostatnio dodanych rekordów. w tabeli mam pole created_at - więc na jej podstawie sortuję wpisy ostatnio dodane- po posortowaniu malejącym i ustawieniu limit 10 mam zawsze 10 ostatnich rekordów. jak z tych 10 wybrać jeden losowy rekord?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Pr0100
post
Post #2





Grupa: Zarejestrowani
Postów: 114
Pomógł: 24
Dołączył: 18.01.2008
Skąd: Warszawa

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


zamiast

  1. <?php
  2. mysqli_query(/* ...  */'LIMIT 10')
  3. ?>


daj

  1. <?php
  2. mysqli_query(/* ...  */'LIMIT '.rand(0, 9).', 1')
  3. ?>


Cytat
...w oczekiwaniu na rozwiązanie mojego głównego problemu z sql postanowiłem się wziąć za coś innego.


nie ucz się programować poprzez zakładanie tematów na forum, radze kupić książkę
Go to the top of the page
+Quote Post
zdzichu
post
Post #3





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 28.08.2006

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


wiem, że można to rozwiązać w php - mnie jednak interesuje rozwiązanie czysto sqlowe (bo nie wierze,że się nie da...)
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Można dać ORDER BY RAND(), ale jest to mało wydajne. Lepiej jest właśnie wygenerować identyfikatory i bezpośrednio wg nich wyciągać.
Go to the top of the page
+Quote Post
kefirek
post
Post #5





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


  1. SELECT * FORM (SELECT * FROM tabela ORDER BY created_at DESC LIMIT 10 ) AS tabela ORDER BY RAND() LIMIT 1


Ten post edytował kefirek 23.06.2009, 21:15:07
Go to the top of the page
+Quote Post
eai
post
Post #6





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


kefirek, miałeś literówke i nie potrzebne jest as table

Ostatecznie powinno to wyglądać tak:
  1. SELECT * FROM (SELECT * FROM tabela ORDER BY created_at DESC LIMIT 10 ) ORDER BY RAND() LIMIT 1
Go to the top of the page
+Quote Post
calebos
post
Post #7





Grupa: Zarejestrowani
Postów: 104
Pomógł: 3
Dołączył: 22.02.2008

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


As table jest potrzebne bo kazdy subselect musi miec swoj alias Twoje zapytanie zwroci blad
Go to the top of the page
+Quote Post
eai
post
Post #8





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


Ok, masz racje.
Go to the top of the page
+Quote Post
dymsza
post
Post #9





Grupa: Zarejestrowani
Postów: 62
Pomógł: 4
Dołączył: 24.08.2006

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


witam

jeśli rekordy są stałe dana słownikowa czy coś to możesz je ponumerować 1 do 10

i

  1. SELECT * FROM bla WHERE lp = round(RAND()*10);



i jest maga szybkie aczkolwiek zalecane rozwiązanie(order by rand() ) jest nawet na stronie mysql

pozdro
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 13:46