Dvě věci.
Za prvé, pokud přestanete používat WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
při výběru data získáte tři výhody.
- Vaše vyhledávání data bude sargable :index to urychlí.
- Získáte obecnější schéma výběru měsíců.
- Pokud máte v tabulkách data za několik let, bude to fungovat lépe.
Místo toho obecně používejte tento druh výrazu k vyhledání aktuálního měsíce. Většinu z toho jste již pochopili.
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
Toto vyhledá všechny hodnoty data a času v nebo po půlnoci prvního dne aktuálního měsíce a dříve, ale ne na <
, půlnoci prvního dne příštího měsíce.
Zobecňuje se na libovolný měsíc, který chcete. Například
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
dostane vás minulý měsíc. Funguje to také, když je aktuálním měsícem leden, a funguje to, když máte v tabulkách data za více let.
Tyto výrazy jsou trochu podrobné, protože MySQL nemá FIRST_DAY(date)
funkce, pouze a LAST_DAY(date)
funkce
. Potřebujeme tedy všechny to + INTERVAL 1 DAY
opičí byznys
.
Za druhé, vytažení údajů za předchozí měsíc je stejně jednoduché jako přidání dalšího LEFT JOIN ( SELECT...
klauzule k vašemu stolu, takhle. (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
Jak vidíte, časové období WHERE
klauzule zde získá řádky za předchozí měsíc.