Comment récupérer les données de Mysql pour les jours sans statistiques
Question
Je veux récupérer le nombre d'enregistrements d'une période donnée (par exemple, une semaine), ce qui n'est pas si difficile à faire, mais je me demandais s'il était possible de retourner à zéro dans MySQL qui n'ont aucune inscription.
Un exemple: DONNÉES:
ID_Profile datCreate 1 2009-02-25 16:45:58 2 2009-02-25 16:45:58 3 2009-02-25 16:45:58 4 2009-02-26 10:23:39 5 2009-02-27 15:07:56 6 2009-03-05 11:57:30
SQL:
SELECT DAY(datCreate) as RegistrationDate, COUNT(ID_Profile) as NumberOfRegistrations FROM tbl_profile WHERE DATE(datCreate) > DATE_SUB(CURDATE(),INTERVAL 9 DAY) GROUP BY RegistrationDate ORDER BY datCreate ASC;
Dans ce cas, le résultat serait:
RegistrationDate NumberOfRegistrations 25 3 26 1 27 1 5 1
Évidemment, il me manque deux jours entre les deux. Actuellement, je résous ce problème dans mon code php, mais je me demandais si MySQL pouvait renvoyer automatiquement 0 pour les jours / lignes manquants. Ce serait le résultat souhaité:
RegistrationDate NumberOfRegistrations 25 3 26 1 27 1 28 0 1 0 2 0 3 0 4 0 5 1
De cette façon, nous pouvons utiliser MySQL pour résoudre tous les problèmes concernant le nombre de jours dans un mois au lieu de compter sur du code php pour calculer chaque mois le nombre de jours, car MySQL intègre cette fonctionnalité.
Merci d'avance
La solution
Non, mais une solution de contournement consisterait à créer une table à colonne unique avec une clé primaire de date, préchargée avec des dates pour chaque jour. Vous auriez des dates allant de votre premier point de départ à un futur lointain.
Maintenant, vous pouvez joindre à GAUCHE vos données statistiques, vous obtiendrez alors des valeurs NULL pour les jours sans données. Si vous voulez vraiment un zéro plutôt que zéro, utilisez IFNULL (nomcol, 0)
Autres conseils
Merci à Paul Dixon, j'ai trouvé la solution. Quiconque s'intéresse à la façon dont j'ai résolu ce problème:
Créez d'abord une procédure stockée que j'ai trouvée quelque part pour remplir une table avec toutes les dates de cette année.
CREATE Table calendar(dt date not null); CREATE PROCEDURE sp_calendar(IN start_date DATE, IN end_date DATE, OUT result_text TEXT) BEGIN SET @begin = 'INSERT INTO calendar(dt) VALUES '; SET @date = start_date; SET @max = SUBDATE(end_date, INTERVAL 1 DAY); SET @temp = ''; REPEAT SET @temp = concat(@temp, '(''', @date, '''), '); SET @date = ADDDATE(@date, INTERVAL 1 DAY); UNTIL @date > @max END REPEAT; SET @temp = concat(@temp, '(''', @date, ''')'); SET result_text = concat(@begin, @temp); END call sp_calendar('2009-01-01', '2010-01-01', @z); select @z;
Modifiez ensuite la requête pour ajouter la jointure gauche:
SELECT DAY(dt) as RegistrationDate, COUNT(ID_Profile) as NumberOfRegistrations FROM calendar LEFT JOIN tbl_profile ON calendar.dt = tbl_profile.datCreate WHERE dt BETWEEN DATE_SUB(CURDATE(),INTERVAL 6 DAY) AND CURDATE() GROUP BY RegistrationDate ORDER BY dt ASC
Et nous avons terminé.
Merci à tous pour les réponses rapides et la solution.