Nombre de nouveaux membres inscrit par mois
Résolu/Fermé
A voir également:
- Nouveau membre inscrit sur jecontacte
- Nouveau outlook - Accueil - Mail
- Comment créer un nouveau groupe sur whatsapp - Guide
- Nouveau site coco chat - Accueil - Réseaux sociaux
- Jecontacte compte - Forum Réseaux sociaux
- Membre indisponible vinted - Guide
8 réponses
jordane45
Messages postés
38289
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2024
4 703
22 févr. 2017 à 16:46
22 févr. 2017 à 16:46
@Reivax :
Voici ce que donne ma requête :
Janvier 2016 -> 1 Inscrit
Janvier 2017 -> 1 Inscrit
Février 2017 -> 2 Inscrits
Tous les autres mois (peu importe l'année...) 0 inscrit.
Sinon, plus complet ... (là ça fera tout comme tu veux... :-) )
Il me semble que ça ne marchera pas, car la jointure sera satisfaite s'il y a des inscrits sur le même mois d'une autre année.
Peut-être en déclarant également une sous-requête définissant les années que l'on veut tester (disons de 2015 à 2020...) et en étendant ton mécanisme.
Voici ce que donne ma requête :
Janvier 2016 -> 1 Inscrit
Janvier 2017 -> 1 Inscrit
Février 2017 -> 2 Inscrits
Tous les autres mois (peu importe l'année...) 0 inscrit.
Sinon, plus complet ... (là ça fera tout comme tu veux... :-) )
set @dateDeb = '2015-01-01'; set @datefin = '2020-01-01'; SELECT M.ANNEE ,M.MOIS , coalesce(D.nombre,0) as NB FROM (SELECT YEAR(selected_date) as ANNEE , MONTH(selected_date) as MOIS FROM (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0, (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v WHERE selected_date between @dateDeb and @datefin GROUP BY ANNEE,MOIS ) M LEFT JOIN ( SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre FROM membres GROUP BY YEAR(date_inscription), MONTH(date_inscription) ORDER BY YEAR(date_inscription), MONTH(date_inscription) )D ON D.mois = M.MOIS AND D.annee = M.ANNEE
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
21 févr. 2017 à 14:22
21 févr. 2017 à 14:22
Salut Nils0,
Utilises les fonctions SQL "COUNT()", "MONTH()" et "YEAR()", et en faisant une requête comme cela :
Tu aurais directement le résultat fournit par ton SGBD du nombre de personnes inscrites en Janvier 2017.
(sauf erreur, car non testé)
Dal
Utilises les fonctions SQL "COUNT()", "MONTH()" et "YEAR()", et en faisant une requête comme cela :
SELECT COUNT(*) FROM membres WHERE MONTH(date_inscription) = 1 and YEAR(date_inscription) = 2017
Tu aurais directement le résultat fournit par ton SGBD du nombre de personnes inscrites en Janvier 2017.
(sauf erreur, car non testé)
Dal
J'ai modifié le code (ça s'améliore mais c'est toujours pas ça...), voici le code:
ce qui me donne :
Les membres inscrit par mois:
Le mois de septembre : 1 nouveaux membres
Le mois de janvier : 2 nouveaux membres
Le mois de janvier : 2 nouveaux membres
comment empécher qu'il y est 2 fois la même ligne ?
<?php echo "Les membres inscrit par mois: <br />"; $req = $bdd->prepare("SELECT * FROM membres"); $req->execute(); while ($info = $req->fetch()){ $date = date_parse($info['date_inscription']); switch($date['month']){ case 1: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 1"); $p = $req2->RowCount(); echo "Le mois de janvier : ".$p." nouveaux membres <br />"; break; case 2: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 2"); $p = $req2->RowCount(); echo "Le mois de février : ".$p." nouveaux membres <br />"; break; case 3: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 3"); $p = $req2->RowCount(); echo "Le mois de mars : ".$p." nouveaux membres <br />"; break; case 4: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 4"); $p = $req2->RowCount(); echo "Le mois de avril : ".$p." nouveaux membres <br />"; break; case 5: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 5"); $p = $req2->RowCount(); echo "Le mois de mai : ".$p." nouveaux membres <br />"; break; case 6: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 6"); $p = $req2->RowCount(); echo "Le mois de juin : ".$p." nouveaux membres <br />"; break; case 7: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 7"); $p = $req2->RowCount(); echo "Le mois de juillet : ".$p." nouveaux membres <br />"; break; case 8: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 8"); $p = $req2->RowCount(); echo "Le mois de aout : ".$p." nouveaux membres <br />"; break; case 9: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 9"); $p = $req2->RowCount(); echo "Le mois de septembre : ".$p." nouveaux membres <br />"; break; case 10: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 10"); $p = $req2->RowCount(); echo "Le mois de octobre : ".$p." nouveaux membres <br />"; break; case 11: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 11"); $p = $req2->RowCount(); echo "Le mois de novembre : ".$p." nouveaux membres <br />"; break; case 12: $req2 = $bdd->query("SELECT * FROM membres WHERE MONTH(date_inscription) = 12"); $p = $req2->RowCount(); echo "Le mois de decembre : ".$p." nouveaux membres <br />"; break; default: echo "erreur <br />"; } } ?>
ce qui me donne :
Les membres inscrit par mois:
Le mois de septembre : 1 nouveaux membres
Le mois de janvier : 2 nouveaux membres
Le mois de janvier : 2 nouveaux membres
comment empécher qu'il y est 2 fois la même ligne ?
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
21 févr. 2017 à 14:32
21 févr. 2017 à 14:32
Bonjour,
Comme [Dal], mais avec un GROUP BY tu peux obtenir directement tout ce que tu veux :
Xavier
Comme [Dal], mais avec un GROUP BY tu peux obtenir directement tout ce que tu veux :
SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre FROM membres GROUP BY YEAR(date_inscription), MONTH(date_inscription) ORDER BY YEAR(date_inscription), MONTH(date_inscription)
Xavier
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
21 févr. 2017 à 17:17
21 févr. 2017 à 17:17
Pour préciser ma réponse, voici ce que tu pourrais écrire :
<?php function mois($numero) { switch ($numero) { case 1: return "janvier"; case 2: return "février"; case 3: return "mars"; case 4: return "avril"; case 5: return "mai"; case 6: return "juin"; case 7: return "juillet"; case 8: return "août"; case 9: return "septembre"; case 10: return "octobre"; case 11: return "novembre"; case 12: return "décembre"; default: return false; } } echo "Les membres inscrit par mois : <br />"; $req = $bdd->prepare("SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre FROM membres GROUP BY YEAR(date_inscription), MONTH(date_inscription) ORDER BY YEAR(date_inscription), MONTH(date_inscription)"); $req->execute(); while($info = $req->fetch()) { $date = mois($info['mois']) . ' ' . $info['annee']; $nombre = $info['nombre']; echo "Le mois de $date : $nombre nouveaux membres. <br />"; } ?>
Utilisateur anonyme
22 févr. 2017 à 14:58
22 févr. 2017 à 14:58
J'ai une dernière question, j'aimerais que ça affiche 0 quand il n'y a de nouveau membre inscrit pendant le mois...
exemple :
Le mois de mars: 0 nouveau membre
Merci d'avance
Nils0
exemple :
Le mois de mars: 0 nouveau membre
Merci d'avance
Nils0
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
22 févr. 2017 à 15:29
22 févr. 2017 à 15:29
Ah, là ça devient plus compliqué...
Il va falloir faire de la détection de trous au niveau du PHP, je pense que c'est le plus simple.
L'idée c'est, lors de la boucle, de vérifier si ce qu'on s'apprête à écrire correspond bien au mois suivant et, sinon, de remplir par une ligne à 0.
Du coup je propose quelque chose comme ça :
Je crois que c'est bon.
Par contre j'ai codé ça sans filet (je n'ai pas de serveur sous la main... et l'éditeur de CCM n'est pas franchement adapté pour coder en live...). Dis-moi s'il y a un soucis que tu n'arrives pas à résoudre avec ce code.
Xavier
Il va falloir faire de la détection de trous au niveau du PHP, je pense que c'est le plus simple.
L'idée c'est, lors de la boucle, de vérifier si ce qu'on s'apprête à écrire correspond bien au mois suivant et, sinon, de remplir par une ligne à 0.
Du coup je propose quelque chose comme ça :
<?php function mois_suivant($mois, $annee) { $nouvelle_annee = $annee; $nouveau_mois = $mois + 1; if ($nouveau_mois == 13) { $nouveau_mois = 1; $nouvelle_annee = $annee + 1; } return array($nouveau_mois, $nouvelle_annee); } function mois($numero) { switch ($numero) { case 1: return "janvier"; case 2: return "février"; case 3: return "mars"; case 4: return "avril"; case 5: return "mai"; case 6: return "juin"; case 7: return "juillet"; case 8: return "août"; case 9: return "septembre"; case 10: return "octobre"; case 11: return "novembre"; case 12: return "décembre"; default: return false; } } function remplir_trous ($mois_debut, $annee_debut, $mois_fin, $annee_fin) { list($mois, $annee) = mois_suivant($mois_debut, $annee_debut); while ($mois != $mois_fin || $annee != $annee_fin) { ecrire_inscrits($mois, $annee, 0); list($mois, $annee) = mois_suivant($mois, $annee); } } function ecrire_inscrits ($mois, $annee, $nombre) { $date = mois($mois) . ' ' . $annee; $nombre = $nombre; echo "Le mois de $date : $nombre nouveau(x) membre(s). <br />"; } echo "Les membres inscrits par mois : <br />"; $req = $bdd->prepare("SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre FROM membres GROUP BY YEAR(date_inscription), MONTH(date_inscription) ORDER BY YEAR(date_inscription), MONTH(date_inscription)"); $req->execute(); $debut = true; while($info = $req->fetch()) { if (!$debut) // On ne remplit pas les trous au premier passage... { remplir_trous($mois_precedent, $annee_precedente, $info['mois'], $info['annee']); $debut = false; } ecrire_inscrits($info['mois'], $info['annee'], $info['nombre']); $mois_precedent = $info['mois']; $annee_precedente = $info['annee']; } ?>
Je crois que c'est bon.
Par contre j'ai codé ça sans filet (je n'ai pas de serveur sous la main... et l'éditeur de CCM n'est pas franchement adapté pour coder en live...). Dis-moi s'il y a un soucis que tu n'arrives pas à résoudre avec ce code.
Xavier
jordane45
Messages postés
38289
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2024
4 703
Modifié par jordane45 le 22/02/2017 à 15:53
Modifié par jordane45 le 22/02/2017 à 15:53
Bonjour,
Facile...via une requête ...
'aimerais que ça affiche 0 quand il n'y a de nouveau membre inscrit pendant le mois..
Facile...via une requête ...
SELECT M.mois , coalesce(D.nombre,0) as NB ,D.annee FROM (SELECT 1 as mois UNION SELECT 2 as mois UNION SELECT 3 as mois UNION SELECT 4 as mois UNION SELECT 5 as mois UNION SELECT 6 as mois UNION SELECT 7 as mois UNION SELECT 8 as mois UNION SELECT 9 as mois UNION SELECT 10 as mois UNION SELECT 11 as mois UNION SELECT 12 as mois ) M LEFT JOIN ( SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre FROM membres GROUP BY YEAR(date_inscription), MONTH(date_inscription) ORDER BY YEAR(date_inscription), MONTH(date_inscription) )D ON D.mois = M.mois
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
Modifié par Reivax962 le 22/02/2017 à 16:24
Modifié par Reivax962 le 22/02/2017 à 16:24
Il me semble que ça ne marchera pas, car la jointure sera satisfaite s'il y a des inscrits sur le même mois d'une autre année.
Peut-être en déclarant également une sous-requête définissant les années que l'on veut tester (disons de 2015 à 2020...) et en étendant ton mécanisme.
Peut-être en déclarant également une sous-requête définissant les années que l'on veut tester (disons de 2015 à 2020...) et en étendant ton mécanisme.
jordane45
Messages postés
38289
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2024
4 703
23 févr. 2017 à 13:12
23 févr. 2017 à 13:12
Tu as repris quel code ?
Utilisateur anonyme
23 févr. 2017 à 14:21
23 févr. 2017 à 14:21
ce code là :
$sql = "SELECT M.ANNEE ,M.MOIS , coalesce(D.nombre,0) as NB FROM (SELECT YEAR(selected_date) as ANNEE , MONTH(selected_date) as MOIS FROM (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0, (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v WHERE selected_date between :dateDeb and :datefin GROUP BY ANNEE,MOIS ) M LEFT JOIN ( SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre FROM membres GROUP BY YEAR(date_inscription), MONTH(date_inscription) ORDER BY YEAR(date_inscription), MONTH(date_inscription) )D ON D.mois = M.MOIS AND D.annee = M.ANNEE"; // Période de date pour l'affichage : $adatas = array(':dateDeb'=>'2010-01-01',':datefin'=>'2020-01-01'); try{ $req = $bdd->prepare($sql); $req->execute($adatas); //on stocke le resultat dans un array... $resultat = $req->fetchAll(); }catch(Exception $e){ //En cas de souci dans la requete. echo "Erreur ! " .$e->getMessage(); } //on retravaille l'array pour avoir quelquechose de plus exploitable : //on boucle sur le resultat de la requete : $arrfinal = array(); foreach($resultat as $R){ $A = $R['ANNEE']; $M = $R['MOIS']; $NB = $R['NB']; $arrfinal[$A][$M]=$NB; } $a_mois = array('janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre'); ?> <html> <head> <title> TEST </title> <meta charset="utf8"> </head> <body> <?php //on boucle sur l'array retravaillé pour faire l'affichage ... foreach($arrfinal as $ANNEES=>$MOIS){ echo "<br><b>Année :$ANNEES</b>"; foreach($MOIS as $mois=>$p){ echo "<br>Le mois de ".$a_mois[$mois-1] ." : $p nouveau". ($p>1 ? "x" : "") . " membre". ($p>1 ? "s" : ""); } } ?> </body> </html>
jordane45
Messages postés
38289
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2024
4 703
23 févr. 2017 à 14:49
23 févr. 2017 à 14:49
Et si tu fais :
SELECT M.ANNEE ,M.MOIS , coalesce(D.nombre,0) as NB FROM (SELECT YEAR(selected_date) as ANNEE , MONTH(selected_date) as MOIS FROM (select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0, (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v WHERE selected_date between :dateDeb and :datefin GROUP BY ANNEE,MOIS ) M LEFT JOIN ( SELECT YEAR(date_inscription) as annee, MONTH(date_inscription) as mois, COUNT(*) as nombre FROM membres GROUP BY YEAR(date_inscription), MONTH(date_inscription) ORDER BY YEAR(date_inscription), MONTH(date_inscription) )D ON D.mois = M.MOIS AND D.annee = M.ANNEE ORDER BY M.ANNEE,M.MOIS ASC
22 févr. 2017 à 17:42
set @dateDeb = '2015-01-01';
set @datefin = '2020-01-01';
c'est a mettre aussi dans la requete sql ?
22 févr. 2017 à 17:45
Ou sinon tu remplaces directement les cariables dans la requete...(C'est plus simple )
22 févr. 2017 à 17:51
22 févr. 2017 à 19:10
NB : N'oublie pas, si ce n'est pas déjà fait, d'activer la gestion des erreurs PDO
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
22 févr. 2017 à 20:08