![]() |
![]() ![]() |
![]() |
![]() ![]()
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 ![]() ![]() 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. -------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]()
Post
#3
|
|
Grupa: Nieautoryzowani Postów: 92 Pomógł: 15 Dołączył: 21.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witaj
Nie wiem czy dobrze zrozumiałem, ale może chodzi ci o coś takiego
liczba 3600 to dana co ile sekund ma odbyc sie to "niby" nowe losowanie jak zmienisz na 10 to po kazdych 10 sekundach bedzie zmieniona kolejnosc wynikow pozdr PS. mozesz pominac RAND() czyli zostaje ROUND(UNIX_TIMESTAMP()/3600) Ten post edytował heaven 28.08.2008, 13:43:08 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 15.08.2025 - 03:07 |