Comment récupérer les données de Mysql pour les jours sans statistiques

StackOverflow https://stackoverflow.com/questions/614739

  •  03-07-2019
  •  | 
  •  

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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top