Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Obejście RAND() w zapytaniu
ArekBe
post 6.03.2013, 15:49:41
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 17.09.2012

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


Witam!

W zapytaniu mam ORDER BY RAND(). Losuje mi to rekordy z bazy danych. Jest kilka wad, a mnie drażni to, że np: rekordy często mogą się powtarzać, nie ma gwarancji, że wszystkie rekordy zostaną wyświetlone. Macie jakieś propozycje do systemu, który pierwsze pokaże wszystkie rekordy, a dopiero potem będą się one powtarzać? Zależy mi na powtarzaniu, ale dopiero po wyświetleniu wszystkich unikalnych, czyli bez powtórzeń. Wyświetlanie rekordów na stronie głównej to wyświetlenie 1 rekordu losowego, po naciśnięciu odpowiedniego przycisku pokazuje się kolejny rekord.
Nie oczekuję GOTOWCA, lecz porady, pomysłu i ewentualnych pomocy w tworzeniu skryptu.

Z góry dziękuję i pozdrawiam,
Arek!
Go to the top of the page
+Quote Post
Michael2318
post 6.03.2013, 15:57:25
Post #2





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

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


Jak Ci się rekordy mogą powtarzać? RAND() tylko je w losowej kolejności wyświetli, a to czy ty w bazie masz kilka takich samych wpisów czy nie to już nie zależy od funkcji rand(), więc albo zrób porządek w bazie albo zastosuj GROUP BY nazwa_pola (grupowac najlepiej po ID).
Go to the top of the page
+Quote Post
ArekBe
post 6.03.2013, 16:19:58
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 17.09.2012

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


Niee, każdy rekord jest unikalny, ale zapytanie po naciśnięciu przycisku wysyła się ponownie, czyli rekordy mogą się powtarzać po kilku kliknięciach.
Go to the top of the page
+Quote Post
_Borys_
post 6.03.2013, 17:37:17
Post #4





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

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


Można by stworzyć dodatkowy wiersz w bazie i zapisywać które było wylosowane ale to nieoptymalne ponieważ gdy większość będzie już wylosowana to baza sporo się napracuje aby wyszukać niewylosowaną wartość. Ja bym pobrał wszystkie wartości albo id z których baza losuje i wsadził do tablicy w php, potem shuffle($tablica) i z powrotem do bazy do innego wiersza. Następnie po kolei z bazy pobierać to co było przetasowane i sprawdzać przy okazji czy to nie ostatni rekord. Do formularza można dołączyć ukryty input albo sesję z aktualnym rekordem pobranym i przy odbiorze formularza pobierać następny rekord z bazy.
Go to the top of the page
+Quote Post
Crozin
post 6.03.2013, 17:38:39
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Musiałbyś najpierw gdzieś pobrać i wymieszać identyfikatory rekordów, zapisać je w jakimś trwałym miejscu (sesja/plik w zależności od potrzeb). Przy przeładowaniu wycinasz fragment tych rekordów i zwracasz wyniki już po identyfikatorach, bez konieczności mieszania.
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 Wersja Lo-Fi Aktualny czas: 31.07.2025 - 09:22