To ting.
For det første, hvis du holder op med at bruge WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
for at vælge dine datoer får du tre fordele.
- Din datosøgning bliver sargable :et indeks vil fremskynde det.
- Du får en mere generel ordning for valg af måneder.
- Hvis du har flere års data i dine tabeller, vil tingene fungere bedre.
Brug i stedet generelt denne form for udtryk til at søge efter den nuværende måned. Du har allerede fundet ud af det meste af dette.
WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
AND wydatki.data_zakupu < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 0 MONTH
Dette ser efter alle datetime-værdier på eller efter midnat på den første dag i denne måned og før, men ikke på <
, midnat den første dag i næste måned.
Det generaliserer til enhver måned, du ønsker. For eksempel
WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH
AND wydatki.data_zakupu < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
får dig sidste måned. Dette fungerer også, når den aktuelle måned er januar, og det virker, når du har flere års data i dine tabeller.
Disse udtryk er lidt ordrette, fordi MySQL ikke har en FIRST_DAY(date)
funktion, kun a LAST_DAY(date)
funktion
. Så vi har brug for alle der + INTERVAL 1 DAY
abevirksomhed
.
For det andet er udtrækning af en tidligere måneds data lige så simpelt som at tilføje endnu en LEFT JOIN ( SELECT...
klausul til dit bord, sådan. (http://sqlfiddle.com/#!9/676df4/13
)
SELECT ...
coalesce(month1.tot, 0) AS LastMonth
FROM wydatki_kategorie cat
LEFT JOIN
...
LEFT JOIN
(SELECT wydatki_wpisy.kategoria,
sum(wydatki_wpisy.brutto) AS tot
FROM wydatki_wpisy
LEFT JOIN wydatki ON wydatki_wpisy.do_wydatku = wydatki.id_wydatku
WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH
AND wydatki.data_zakupu < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
AND wydatki.id_kupujacy = 1
GROUP BY wydatki_wpisy.kategoria
) month1 ON cat.id_kat = month1.kategoria
Som du kan se, er datointervallet WHERE
klausul her får den foregående måneds rækker.