Grzegorz M.

Grzegorz M. www.avatec.pl

Temat: Grupowanie według miesiąca

Witajcie,

Mam taki problem. Posiadam w bazie zapisane daty w postaci 2010-01-28, 2010-01-27 itp. Problem polega na tym, aby pierw wygenerować ostatnie 12 miesięcy poczynając od najnowszego, a następnie wyświetlać wszystkie wpisy z wybranym miesiącem.

Identyczne rozwiązanie jest w wordpressie.

Główkuje tak:
- pobieram daty, potem tworze tablicę: $array[rok][miesiac] = $id;
- dzięki temu mogę wydzielić ostatnie 12 mc poczynając od najnowszego wpisu;
- potem wyświetlam na zasadzie podania miesiaca w MySQL.

W zasadzie powinno to działać, ale straszne zagmatwanie ... robię w pętlach itp. Czy może ktoś poradzić jakiś sposób, ewentualnie naprowadzić na jakieś gotowe rozwiązanie w postaci klasy, lub funkcji ?

Być może można zrobić to prościej... liczę na pomoc !!

konto usunięte

Temat: Grupowanie według miesiąca

A może zrzucić to na karby bazy ?

Jeśli chodzi o ostatnie 12 miesięcy:
SELECT MIN(id) idFirst, MAX(id) idLast, MONTH(`data`) `date` FROM ... WHERE `data` >= CURDATE() - INTERVAL 12 MONTH ORDER BY `data` ASC GROUP BY MONTH(`data`)

Jeśli chodzi o wybieranie miesiąca z
SELECT * FROM ... WHERE MONTH('data') = _konkretny_miesiac AND id BETWEEN idFirst and idLast

gdzie idFirst and idLast dostajesz z listy z zapytania pierwszego (idFirst to min z pierwszego wiersza, idLast to max z ostatniego wiersza)

Najlepiej byłoby dodać jedną kolumnę z miesiącem i dodać tam index bo te pierwsze zapytania może są fajne, ale nieoptymalne bo na bank nie polecą po indeksach, choćbyś nie wiem jakie stworzył.
Ale z dodatkową kolumną `miesiac`:

SELECT miesiac FROM ... WHERE `date` >= CURDATE() - INTERVAL 12 MONTH ORDER BY miesiac

---

Jeśli to maja być ostatnie 12 miesięcy ogólnie zapisane do bazy to:
$max = SELECT `date` FROM ... LIMIT 1 ORDER BY `date` DESC LIMIT 1
SELECT ... FROM ... WHERE `date` >= :max - INTERVAL 12 MONTH ... itd..

Można to też trzasnać w jednym zapytaniu z subselectem.
---
Mam nadzieje, że pomogłem lub choć nakierowałem.

Zapytania pisane 'na kolanie' :)
Jakub L.

Jakub L. Programista

Temat: Grupowanie według miesiąca

A nie lepiej po prostu użyć pierwszego zapytania i jako warunek dać
where data >= curdate() - interval 12 month and data >= ${początek danego miesiąca} and data <= ${koniec danego miesiąca}
bez grupowania i podwójnych zapytań?

konto usunięte

Temat: Grupowanie według miesiąca

Grzegorz M.:
Witajcie,

W zasadzie powinno to działać, ale straszne zagmatwanie ... robię w pętlach itp. Czy może ktoś poradzić jakiś sposób, ewentualnie naprowadzić na jakieś gotowe rozwiązanie w postaci klasy, lub funkcji ?

Generalnie najlepiej jest takie rzeczy pisać w postaci klas implementujących iterator + pare tricków typu chain. Datę obsługiwać przez obiekt Date (to jest typ zmiennej indeksu dla iteratora). Cała zabawa polega na tym żeby w widoku zostały dwie pętle (rok, miesiąc).
Grzegorz M.

Grzegorz M. www.avatec.pl

Temat: Grupowanie według miesiąca

Witam,

Przespałem się, wypocząłem i zrobiłem to bardzo prościutko :-)

for($i=0;$i<=12;$i++)
{
$next = mktime(0, 0, 0, date("m")-$i, date("d"), date("Y"));
$month = date('m', $next);
$year = date('Y' , $next);
echo '<a href="index.php?miesiac='.$month.'&rok='.$year.'">'.$mysql->nazwaMiesiaca($month).' '.$year.'</a><br/>';
}

potem już tylko zapytanie do bazy where miesiąc pasuje i rok pasuje :-) działa :P hehe
Michał Stachura

Michał Stachura Dedykowane serwisy i
strony www -
http://santri.eu

Temat: Grupowanie według miesiąca

W ten sposób generujesz 12 zapytań do bazy. Może szybciej by było wyciągnąć wszystko za jednym zapytaniem wrzucić do tablicy i później obrobić wyświetlając wyniki?
Użyj może DATE_FORMAT dla wyciągnięcia miesiąca wpisu pogrupuj po dacie i to wystarczy.

SELECT wpis, DATE_FORMAT(data_wpisu, '%Y-%m') FROM wpisy WHERE DATE_FORMAT(data_wpisu, '%Y-%m') BETWEEN '2009-01' AND '2010-01' GROUP BY data_wpisu

Co prawda u siebie w bazie masz zapisane daty w formacie %Y-%m-%d ale przy timestampie możesz definiować w jakim formacie chcesz wynik i w jakim ma przeszukiwać bazę.

Poźniej na formularzu przekazujesz już tylko datę w formacie yyyy-mm i nie musisz używać mktime plus 2 razy funkcji date.

Tutaj znajdziesz nieco więcej informacji na ten temat:Michał Stachura edytował(a) ten post dnia 30.01.10 o godzinie 14:24
Wojciech K.

Wojciech K. realizator pomysłów
własnych

Temat: Grupowanie według miesiąca

Michał Stachura:
W ten sposób generujesz 12 zapytań do bazy.

w kodzie Grzegorza nie ma ani jednego zapytania :)
Michał Stachura

Michał Stachura Dedykowane serwisy i
strony www -
http://santri.eu

Temat: Grupowanie według miesiąca

Wojciech K.:
Michał Stachura:
W ten sposób generujesz 12 zapytań do bazy.

w kodzie Grzegorza nie ma ani jednego zapytania :)
W kodzie nie ma ale w opisie problemu już tak :)
Główkuje tak:
- pobieram daty, potem tworze tablicę: $array[rok][miesiac] = $id;
- dzięki temu mogę wydzielić ostatnie 12 mc poczynając od najnowszego wpisu;
- potem wyświetlam na zasadzie podania miesiaca w MySQL.
I później Grzesiek pisze:
potem już tylko zapytanie do bazy where miesiąc pasuje i rok pasuje :-) działa :P hehe
Wnioskuję, że jednak idzie te 12 zapytań do bazy po utworzeniu tablicy z miesiącami. Nie ma takiej konieczności.Michał Stachura edytował(a) ten post dnia 01.02.10 o godzinie 09:30
Grzegorz M.

Grzegorz M. www.avatec.pl

Temat: Grupowanie według miesiąca

Witam nie idzie :-)
Powyższy kod generuje listę ostatnich miesięcy, gdy mam listę (w html) mam również link z id:

domena.pl/grudzien,2009.html

majac rok, zadaje jedno zapytanie

SELECT * FROM wpisy WHERE data_dodania BETWEEN '".$_GET['year']."-".$_GET['miesiac']."-1' AND '".$_GET['year']."-".$_GET['miesiac']."-31'

ps. wpis może być błędny, bo piszę od ręki :-)
Michał Stachura

Michał Stachura Dedykowane serwisy i
strony www -
http://santri.eu

Temat: Grupowanie według miesiąca

Spoko, zrozumiałem, że odpytujesz od razu za cały rok po każdym miesiącu i grupujesz wpisy po danym miesiącu :).

Jeśli chcesz wyświetlić tylko dla danego miesiąca to tez bym inaczej podszedł. "Grudzień" zamieniłbym na cyferkę a później zapytał sqla o dany miesiąc bez BETWEENa. Po co ma się php dodatkowo męczyć pętlą jak i tak mysql musi. Ale to drugorzędne. Najważniejsze, że działa.

BTW. Dajesz zmienne GET bezpośrednio do zapytania sql? ...odważnie.
Spróbuj użyć PDO

Następna dyskusja:

MongoDB grupowanie po




Wyślij zaproszenie do