Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL+PHP] Pobieranie posortowanych wyników..., ...w niecodzienny sposób.
DJ ProG
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 2
Dołączył: 27.08.2008

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


Witam.

Przejdę od razu do rzeczy: posiadam autorski skrypt, listujący wybrane podmioty z bazy MySQL. Dzieje się to za pomocą utworzonych kategorii (czego działania nie muszę chyba tłumaczyć, bo takie opcje ma większość współczesnych CMSów).
Powiedzmy, że w skrócie tak wygląda struktura podmiotów: id | category | name | col.

Owe podmioty mają być wyświetlane wg jednej z kolumn (dajmy col DESC), a drugim parametrem ma być kolejność losowa. Problem w tym, że owe "losowanie" ma odbywać się co jakiś czas, np. co godzinę. No właśnie, jak to zrobić? Jak zrobić, by losowanie zwracało te same wyniki dla wybranego przedziału czasowego (określanego w minutach) ?

Myślałem nad ciastkami, sesjami itp. w których przechowywane byłyby IDy podmiotów (wszystko jakoś zaszyfrowane wraz z sumą kontrolną - zawsze bezpieczniej (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ). W przypadku ich istnienia skrypt zaczytywałby i wyświetlał listę zapisanych pozycji. Problem w tym, że trzymanie tych danych w sesjach jest niemożliwe (ze względu na strukturę systemu, która co jakiś czas opróżnia wszystkie dane sesyjne), a w ciastkach mogłoby się okazać zbyt hmm... "nieoptymalne". No właśnie, ja poszukuję optymalnego rozwiązania, gdyż przecież ilość owych podmiotów nie jest zależna ode mnie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) .
Podczas wczorajszych rozmów z kolegą wpadłem na pomysł, aby wylosowane IDy (SELECT id FROM tbl WHERE category="n" ORDER BY tbl DESC, RAND()) zapisywać w bazie, np. id | category | idz - gdzie idz będzie miało postać np. "5,13,88,33,45,74,2,14,22". Ew. dodałoby się kolumnę page, która odpowiadałaby numerowi strony podczas listingu danej kategorii, co znacznie usprawniłoby wyświetlanie wyników.

I tu pojawia się kolejny problem: jak pobrać tylko rekordy o podanych IDach, ale w taki sposób, by ich kolejność była zależna od parametru? Czyli mam zapisane te numery do pobrania i jak to mogę zrobić, by zostały wyświetlone jedynie one i w "wejściowej" kategorii? Bo nie mam pomysłu dla WHERE id IN (n1,n2,n3...) by wyniki były posortowane jak ja chcę...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
nevt
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


Ja bym to raczej załatwił w większości po stronie bazy danych.

Prosty algorytm:

krok_0:
Sprawdzasz czy istnieje w bazie tabela tymczasowa o wybranym szablonie nazwy (np. tmp_xx, gdzie xx to pełna godzina utworzenia tabeli). Jeżeli TAK to krok_2, jeżeli NIE to krok_1.

krok_1:
W php generujesz tabelę tymczasową, do której przenosisz dane z kolumnami posortowanymi jak ci potrzeba, w nazwie zaszywasz pełną godzinę utworzenia tabeli (np. tmp_09). Następnie krok_2.

krok_2:
Także w php sprawdzasz czy bieżąca godzina zgadza się z godziną w nazwie tabeli tymczasowej. Jeżeli TAK to następnie krok_3, jeżeli NIE wracamy do krok_1.

krok_3:
Wyświetlasz na stronce dane z tabeli tymczasowej w zapamiętanym tam porządku (czyli bez sortowania).

Dodatkowy bonus rozwiązania: dane do wyświetlenia są cachowane, serwer nie musi za każdym razem (a tylko raz na godzinę) wyszukiwać i sortować danych w skomplikownych SELECT'ach.

Powodzenia.
Go to the top of the page
+Quote Post

Posty w temacie


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: 13.10.2025 - 13:04