Deux choses.
Tout d'abord, si vous arrêtez d'utiliser WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
pour choisir vos dates, vous bénéficierez de trois avantages.
- Votre recherche de date deviendra sargable :un index l'accélérera.
- Vous obtiendrez un schéma plus général pour choisir les mois.
- Si vous avez plusieurs années de données dans vos tableaux, les choses fonctionneront mieux.
Au lieu de cela, utilisez généralement ce type d'expression pour rechercher le mois en cours. Vous avez déjà compris la plupart de cela.
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
Cela recherche toutes les valeurs datetime à ou après minuit le premier jour du mois en cours, et avant, mais pas sur <
, minuit le premier jour du mois suivant.
Il se généralise à n'importe quel mois que vous voulez. Par exemple,
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
vous reçoit le mois dernier. Cela fonctionne également lorsque le mois en cours est janvier, et cela fonctionne lorsque vous avez plusieurs années de données dans vos tables.
Ces expressions sont un peu verbeuses car MySQL n'a pas de FIRST_DAY(date)
fonction, seulement a LAST_DAY(date)
fonction
. Nous avons donc besoin de tous les qui + INTERVAL 1 DAY
affaire de singe
.
Deuxièmement, extraire les données d'un mois précédent est aussi simple que d'ajouter un autre LEFT JOIN ( SELECT...
clause à votre table, comme ça. (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
Comme vous pouvez le voir, la plage de dates WHERE
clause ici obtient les lignes du mois précédent.