Champ n'ayant pas de valeur pour certaines occurrences

Eléphanteau du PHP | 11 Messages

19 mai 2019, 19:42

(re)Bonjour,

Après que vous m'ayez aidé sur des tableaux, je vous sollicite à nouveau car je rencontre également un problème avec l'exploitation de certaines données. Pour mémoire, je gère les inscriptions pour un tournoi de notre club sportif à l'aide d'un formulaire qui a une date d'ouverture et une date de fermeture. Entre les deux, les licenciés peuvent s'inscrire et leur inscription est horodatée.

Ce que j'ai besoin de faire, c'est de cumuler, pour chaque jour, le nombre d'inscriptions et de faire un cumul progressif, tout ça pour au final me permettre de générer un graphique.
Mon souci, c'est que si j'arrive à le faire pour les dates où il y a eu des inscriptions, je n'arrive pas à prendre en compte les journées où il n'y a eu aucune inscription.

Je pensais faire une boucle while en démarrant à la date d'ouverture des inscriptions en récupérant la donnée quotidienne et ensuite à incrémenter la boucle de 1 jour, et ainsi de suite. Sauf que je n'arrive à récupérer que la première valeur et c'est celle-ci qui me remonte pour toutes les dates :?

Comment m'y prendre ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 mai 2019, 11:57

Sauf que je n'arrive à récupérer que la première valeur et c'est celle-ci qui me remonte pour toutes les dates :?
ça dépend comment son stockées tes données.
Si c'est dans une table SQL alors c'est très simple, il suffit de faire une requête triée sur la date (ordre antéchronologique) et de prendre que le 1er résultat, qui sera donc le plus ancien.
SELECT * FROM ta_table ORDER BY date_dinscription DESC LIMIT 1; 
+ d'infos :
https://sql.sh/cours/order-by
https://sql.sh/cours/limit
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 11 Messages

20 mai 2019, 12:36

Les données sont effectivement dans une base MySQL. J'ai déjà une requête plus ou moins équivalente à celle que tu indiques. Imaginons que les inscriptions soient ouvertes du 1er au 31 mai 2019 et que personne ne ce soit inscrit le 4 mai. La requête ne me remontera aucune info alors que je voudrais obtenir un 0 et plus généralement une valeur pour chacun des journées depuis le 1er jusqu'au 31 mai.

Eléphanteau du PHP | 11 Messages

20 mai 2019, 21:11

Pour être un peu plus explicite, voici la requête qui me permet de récupérer le nombre d'inscriptions pour chacun des jours où il y a eu des inscriptions :
$requete1 = "SELECT LEFT(date,10) AS date_insc, COUNT(date) AS nb_insc FROM TN_inscriptions GROUP BY date_insc";
Et voici le résultat :
2018-04-10 - 6
2018-04-11 - 3
2018-04-12 - 2
2018-04-13 - 2
2018-04-14 - 2
2018-04-15 - 3
2018-04-18 - 1
2018-04-21 - 1
2018-04-22 - 1
2018-04-25 - 1
2018-04-26 - 2
2018-04-27 - 1
2018-04-28 - 2
2018-05-01 - 2
2018-05-02 - 4
2018-05-04 - 4
2018-05-05 - 4
2018-05-06 - 4
2018-05-07 - 3
2018-05-08 - 5
2018-05-09 - 4
2018-05-10 - 12
2018-05-11 - 3
2018-05-12 - 6
2018-05-13 - 19
2018-05-14 - 13
2018-05-15 - 14
2018-05-16 - 14
2018-05-17 - 3
2018-05-18 - 2
2018-05-19 - 3
2018-05-20 - 2
2018-05-21 - 1
C'est presque bien si ce n'est que, par exemple, je n'ai aucune valeur pour les 16 et 17 avril 2018, dates où personne ne s'est inscrit. Or, j'aimerai voir ces dates apparaître (ainsi que les autres dates absentes) avec une valeur 0.

Comme je l'ai indiqué dans mon premier message, je pensais faire une boucle while qui me permet de défiler tous jours sans exception et, au sein de cette boucle, faire ma requête pour obtenir le nombre d'inscriptions de la journée en question. Mais je vois potentiellement deux soucis. Primo, je ne suis pas sûr que ça soit très "propre" en terme de codage ni très efficace pour ce qui est des temps de réponse. Secundo, pour une journée sans inscription, est-ce que je vais bien obtenir un joli zéro ou une valeur d'erreur ?