Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL+PHP] Pobieranie posortowanych wyników...
Forum PHP.pl > Forum > Bazy danych > MySQL
DJ ProG
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 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 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ę...
nevt
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.
heaven
Witaj
Nie wiem czy dobrze zrozumiałem, ale może chodzi ci o coś takiego

  1. SELECT * FROM test ORDER BY col, RAND(ROUND(UNIX_TIMESTAMP()/3600))


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)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.