to moze podam na konkretnym przykladzie:
w tabeli jest data (d.m.r) i ilosc zlecen odpowiadajaca danej dacie (sa jeszcze inne komorki, ale dla tego przykladu nie sa az tak istotne teraz), czyli dla przykladu:
data | ilosc zlecen
01.02.2010 | 15
15.02.2010 | 22
03.04.2010 | 2
03.04.2010 | 8
i teraz chce zestawienie za dany rok np. 2010 w tabelce, ktora ma format (dane dla ww przykladu):
miesiac | 01.2010 | 02.02010 | 03.2010 | 04.2010 | itd.
ilosc zlecen | 0 | 37 | 0 | 10 | itd.
poczatkowo mialem taki kod (rozwiazanie nr 1):
$sql->query('SELECT COUNT(id_zlecenie) AS ilosc, DATE_FORMAT(data_z, \'%m-%Y\') AS data FROM zlecenie INNER JOIN zleceniodawca AS firma3 ON zlecenie.id_zb=firma3.id_fast INNER JOIN firma AS firma1 ON zlecenie.id_zleceniobiorca=firma1.id_firma INNER JOIN firma AS firma2 ON zlecenie.id_zleceniodawca=firma2.id_firma WHERE czy_anulowane = 0 GROUP BY data ORDER BY id_zlecenie ASC');
print '<div class="statystyki"> <table>
<caption>Ilość zleceń w danych miesiącach</caption>
<tr><th>Miesiąc</th>';
while($statystyki = $sql->fetchArray()) {
<th>'.$statystyki['data'].'
</th>';
}
//czyli zapytanie i wyplucie wiersza z miesiacami 02.2010| 04.2010
<tr><td>ilość zleceń</td>';
$sql->query('SELECT COUNT(id_zlecenie) AS ilosc, DATE_FORMAT(data_z, \'%m-%Y\') AS data FROM zlecenie INNER JOIN zleceniodawca AS firma3 ON zlecenie.id_zb=firma3.id_zb INNER JOIN firma AS firma1 ON zlecenie.id_zleceniobiorca=firma1.id_firma INNER JOIN firma AS firma2 ON zlecenie.id_zleceniodawca=firma2.id_firma WHERE czy_anulowane = 0 GROUP BY data ORDER BY id_zlecenie ASC');
while($statystyki = $sql->fetchArray()) {
<td>'.$statystyki['ilosc'].'
</td>';
}
//czyli ponownie to samo zapytanie i wyplucie wiersza z iloscia zlecen w postaci 37 | 10 (odpowiadajace odpowiednim miesiacom z poprzedniego zapytania)
</table></div>';
czyli, w zasadzie zapytanie do bazy bylo 2 razy to samo, ale wynik byl w tabeli, ktora:
po 1. ciagnela sie w nieskonczonosc i nie mozna bylo jej przelamac np jak zaczal sie nowy rok
po 2. wynik pomijal miesiace, gdzie byla ilosc 0
poradzilem sobie w taki sposob (rozwiazanie nr 2):
print '<div class="statystyki"> <h1>Ilość zleceń w danych miesiącach</h1>
';
$zapytanie = mysql_query('SELECT DATE_FORMAT(data_zaladunku, \'%Y\') AS rok FROM zlecenie INNER JOIN zleceniodawca AS firma3 ON zlecenie.id_zb=firma3.id_zb INNER JOIN firma AS firma1 ON zlecenie.id_zleceniobiorca=firma1.id_firma INNER JOIN firma AS firma2 ON zlecenie.id_zleceniodawca=firma2.id_firma WHERE czy_anulowane = 0 GROUP BY rok ORDER BY rok DESC');
//pobranie wszystkich lat, dla ktorych istnieja dane w bazie, ponizej petla tworzaca tabele z zestawieniem dla konkretnego roku
$statystyki_rok = $statystyki_lata['rok'];
<table>
<caption>Rok '.$statystyki_rok.'</caption>
<tr><th>Miesiąc</th>';
$miesiac = 1;
while($miesiac != 13) {
<th>'.$miesiac.'-'.$statystyki_rok.'
</th>';
$miesiac++;
}
// wypisanie wszystkich miesiecy dla danego roku
<tr><td>ilość zleceń</td>';
$miesiac = 1;
while($miesiac != 13) {
$sql->query('SELECT COUNT(id_zlecenie) AS ilosc, DATE_FORMAT(data_z, \'%c-%Y\') AS data, DATE_FORMAT(data_z, \'%c\') AS miesiac, DATE_FORMAT(data_z, \'%Y\') AS rok FROM zlecenie INNER JOIN zleceniodawca AS firma3 ON zlecenie.id_zb=firma3.id_zb INNER JOIN firma AS firma1 ON zlecenie.id_zleceniobiorca=firma1.id_firma INNER JOIN firma AS firma2 ON zlecenie.id_zleceniodawca=firma2.id_firma WHERE czy_anulowane = 0 AND DATE_FORMAT(data_zaladunku, \'%Y\') = \''.$statystyki_rok.'\' AND DATE_FORMAT(data_zaladunku, \'%c\') = \''.$miesiac.'\' GROUP BY data ORDER BY id_zlecenie ASC');
$statystyki = $sql->fetchArray();
<td>';
if (!empty($statystyki['ilosc'])) { print $statystyki['ilosc']; }
else {
}
</td>';
$miesiac++;
}
// wypisanie ilosci zlecen dla konkretnego miesiaca,
</table>';
}
i w zasadzie dziala idealnie, bo otrzymuje to co chcialem - jest tylko jedno, ale - dla kazdego miesiaca jest zapytanie do bazy, wobec czego dla dluzszego okresu (np. pare lat) zapytan sie zrobi wieksza ilosc,
i teraz pytanie brzmi czy moze da sie zrobic to jakos latwiej/prosciej/mniejsza iloscia zapytan (zmieniajac niekoniecznie samo zapytanie do bazy, ale moze rowniez sam kod php/html)?
mysle, ze zagadnienie jest dosc ogolne, bo wystepuje wszedzie tam gdzie chcemy otrzymac dane statystyczne w formie tabeli z podzialem na dane miesiace, przy czym wystepuja miesiace, ktore w bazie nie istnieja (bo bylo 0 zlecen).
ehh troche sie rozpisalem

w kazdym razie dzieki za zainteresowanie tematem

pozdrawiam.