![]() |
![]() |
![]() ![]()
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ę... |
|
|
![]() |
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 13.10.2025 - 13:04 |