Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Skrypt popularności
Forum PHP.pl > Forum > Przedszkole
adamoski11
Witam,

Potrzebuje pomocy w stworzeniu funkcji, która będzie mi zliczała osobno popularność danego artykułu w dniu dzisiejszym, w ostatnich 7 dniach oraz ostatnim miesiącu. Popularność ogólną zapisuje do bazy danych do kolumny popularity, z każdym wyświetleniem artykułu pole popularity wzrasta o 1. W jaki sposób mam zrobić takie dokładniejsze zliczanie? Jest ktoś w stanie mnie naprowadzić?
rad11
Grupujesz wedlug daty dany artykul w selecie policz SUM(popularity) as sum i masz wynik w czym problem?
Fred1485
Nie wiem czy dobrze cię zrozumiałem, ale wg. mnie powinieneś zrobić osobną tabelę w której będziesz zapisywał:

id|id_artykulu|data

I wyciągając informację z bazy skupisz się na dacie, i tutaj już możesz w formacie uniksowym daty sobie dużo obliczeń zrobić z jakiego zakresu ma być to data.
Felan
Cytat(rad11 @ 22.06.2015, 18:58:59 ) *
Grupujesz wedlug daty dany artykul w selecie policz SUM(popularity) as sum i masz wynik w czym problem?

Pamiętaj, że jesteś w dziale Przedszkole. Zadawanie tutaj pytania "w czym problem?" jest nietaktowne, mówiąc delikatnie.

Cytat(adamoski11)
Potrzebuje pomocy w stworzeniu funkcji, która będzie mi zliczała osobno popularność danego artykułu w dniu dzisiejszym, w ostatnich 7 dniach oraz ostatnim miesiącu.

Sama funkcja tego nie zrobi, bo ma za mało danych. Fred ma dobre rozwiązanie - tworzysz osobną tabelę, w której masz kolumny: id artykułu, data (typu DATE, nie DATETIME - godzina jest niepotrzebna), popularność.

Za każdym razem, gdy twoje 'popularity' wzrasta o 1, zamiast tego najpierw sprawdzasz w bazie, czy istnieje już wpis z dzisiejszą datą i jeśli tak, dodajesz tam 1; jeśli nie, dodajesz cały wiersz (id artykułu, data) wraz z jedynką w kolumnie popularność.

Gdy chcesz sprawdzić popularność artykułu w podanym przedziale czasu, możesz użyć strtotime(), date() oraz BETWEEN w MySQL:

  1. $dataMin = date('Y-m-d', strtotime('1 week ago')); //= data tydzień temu
  2. $dataMax = date('Y-m-d'); //= data dziś

I zapytanie w stylu:

  1. SELECT SUM(popularnosc) FROM tabela_popularnosci WHERE id_artykulu = :id_artykulu AND DATA BETWEEN :dataMin AND :dataMax


- zwróci np. 50 dla artykułu, który w zeszłym tygodniu wyświetlono 50 razy. Uważaj na BETWEEN, jest troszkę nieintuicyjny w tym, że wcześniejsza dataMin MUSI być pierwsza (na pierwszy rzut oka wydaje się, że to powinno być obojętne - nie jest).

Gdybyś chciał posortować wszystkie artykuły wg popularności - za enigmatyczną sugestią rad11 - możesz użyć SUM, GROUP BY i ORDER BY, powstanie coś w stylu:

  1. SELECT SUM(popularnosc) AS suma_popularnosci, id_artykulu FROM tabela_popularnosci GROUP BY DATA ORDER BY suma_popularnosci


Swoją drogą - bardzo szczegółowa statystyka. Coś dużego? smile.gif

edit: merytoryczne + coś brzydkiego się porobiło przy formatowaniu.
com
@up gdzieś musi postawić pk wiec najprościej na id. Nie zapominajmy że to są bazy relacyjne
Felan
Cytat(com @ 23.06.2015, 23:10:18 ) *
@up gdzieś musi postawić pk wiec najprościej na id. Nie zapominajmy że to są bazy relacyjne

Dzięki - wyedytowałem dla potomności, żeby nie mieszać w głowach.
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.