Dwie rzeczy.
Po pierwsze, jeśli przestaniesz używać WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
aby wybrać daty, uzyskasz trzy korzyści.
- Wyszukiwanie dat będzie możliwe do sargowania :indeks przyspieszy to.
- Uzyskasz bardziej ogólny schemat wyboru miesięcy.
- Jeśli masz w tabelach dane z wielu lat, wszystko będzie działać lepiej.
Zamiast tego na ogół używaj tego rodzaju wyrażenia do wyszukiwania bieżącego miesiąca. Większość już się zorientowałeś.
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
Wyszukuje wszystkie wartości daty i godziny w dniu lub po północy pierwszego dnia bieżącego miesiąca i wcześniej, ale nie w dniu <
, północ pierwszego dnia następnego miesiąca.
Uogólnia się na dowolny miesiąc. Na przykład
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
dostał cię w zeszłym miesiącu. Działa to również, gdy bieżącym miesiącem jest styczeń, i działa, gdy masz w tabelach dane z wielu lat.
Te wyrażenia są trochę gadatliwe, ponieważ MySQL nie ma FIRST_DAY(date)
funkcja, tylko a LAST_DAY(date)
funkcja
. Więc potrzebujemy wszystkich że + INTERVAL 1 DAY
małpi biznes
.
Po drugie, wyciągnięcie danych z poprzedniego miesiąca jest tak proste, jak dodanie kolejnego LEFT JOIN ( SELECT...
klauzulę do twojego stołu, tak jak. (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 widać, zakres dat WHERE
klauzula tutaj pobiera wiersze z poprzedniego miesiąca.