Twee dingen.
Ten eerste, als u stopt met het gebruik van WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
om uw datums te kiezen, krijgt u drie voordelen.
- Uw datum zoeken wordt sargable :een index zal het versnellen.
- Je krijgt een meer algemeen schema voor het kiezen van maanden.
- Als u meerdere jaren aan gegevens in uw tabellen heeft, zal alles beter werken.
Gebruik in plaats daarvan in het algemeen dit soort uitdrukking om naar de huidige maand te zoeken. Je hebt het meeste hiervan al ontdekt.
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
Dit zoekt naar alle datetime-waarden op of na middernacht op de eerste dag van de huidige maand, en eerder, maar niet op <
, middernacht op de eerste dag van de volgende maand.
Het generaliseert naar elke gewenste maand. Bijvoorbeeld
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
krijgt je vorige maand. Dit werkt ook als de huidige maand januari is, en het werkt ook als je meerdere jaren aan gegevens in je tabellen hebt staan.
Deze uitdrukkingen zijn een beetje uitgebreid omdat MySQL geen FIRST_DAY(date)
heeft functie, alleen a LAST_DAY(date)
functie
. We hebben dus alle die + INTERVAL 1 DAY
apenzaken
.
Ten tweede is het uittrekken van de gegevens van een vorige maand net zo eenvoudig als het toevoegen van nog een LEFT JOIN ( SELECT...
clausule aan uw tafel, zoals zo. (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
Zoals je kunt zien, is de periode WHERE
clausule hier krijgt de rijen van de vorige maand.