[RESOLU] SImplification de requete

Eléphanteau du PHP | 19 Messages

29 nov. 2017, 18:00

Bonjours à toutes et tous,

je pense qu'il y a moyen de simplifié mes multiples requêtes pour n'en faire qu'une, mais je sais pas trop comment m'y prendre.
le but étant de compter le nombre d'entrées par mois et ensuite de les afficher plus tard.

Voici ma grosse requête :
$reponse0117 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-01-01" ORDER BY id_newletter DESC');
$count0117 = $reponse0117->rowCount();
$reponse0217 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-02-01" ORDER BY id_newletter DESC');
$count0217 = $reponse0217->rowCount();
$reponse0317 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-03-01" ORDER BY id_newletter DESC');
$count0317 = $reponse0317->rowCount();
$reponse0417 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-04-01" ORDER BY id_newletter DESC');
$count0417 = $reponse0417->rowCount();
$reponse0517 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-04-01" ORDER BY id_newletter DESC');
$count0517 = $reponse1217->rowCount();
$reponse1217 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-05-01" ORDER BY id_newletter DESC');
$count1217 = $reponse1217->rowCount();
$reponse1217 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-06-01" ORDER BY id_newletter DESC');
$count1217 = $reponse1217->rowCount();
$reponse1217 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-07-01" ORDER BY id_newletter DESC');
$count1217 = $reponse1217->rowCount();
$reponse1217 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-08-01" ORDER BY id_newletter DESC');
$count1217 = $reponse1217->rowCount();
$reponse1217 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-09-01" ORDER BY id_newletter DESC');
$count1217 = $reponse1217->rowCount();
$reponse1217 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-10-01" ORDER BY id_newletter DESC');
$count1217 = $reponse1217->rowCount();
$reponse1217 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-11-01" ORDER BY id_newletter DESC');
$count1217 = $reponse1217->rowCount();
$reponse1217 = $bdd->query('SELECT * FROM newletter WHERE date_newletter = "2017-12-01" ORDER BY id_newletter DESC');
$count1217 = $reponse1217->rowCount();

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 nov. 2017, 19:00

Bonjour,

En utilisant un COUNT() et surtout un GROUP BY directement dans ta requête SQL.

Exemple à tester dans phpmyadmin :
SELECT date_newsletter, COUNT(*) AS nb FROM newsletter WHERE 1 ORDER BY date_newsletter GROUP BY date_newsletter
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 19 Messages

30 nov. 2017, 10:51

Bonjour,

En essayant ta requête dans phpmyadmin, j’obtiens une erreur :
#1064 - Erreur de syntaxe près de 'GROUP BY date_newsletter' à la ligne 1

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

30 nov. 2017, 11:13

Erreur de ma part : le ORDER BY doit être en dernier
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 19 Messages

30 nov. 2017, 11:45

petite question, peut-on obtenir les lignes qui sont à zero aussi?
cela m'aiderai pour l'affichage que je souhaiterai faire.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

30 nov. 2017, 11:55

Pas avec une requête SQL vu que ces enregistrements n'existent pas.
Mais en revanche, c'est facile en PHP, tu fais juste une boucle for sur tous les jours du mois, et dans ta boucle tu affiches le résultat de la requête précédente si il existe, sinon, tu affiche 0
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 19 Messages

30 nov. 2017, 15:49

Je tente depuis ce matin de faire un bout de code mais n'y arrivant pas, je reviens ici.
faut pas trop m'en vouloir, c'est la première fois que je tente ce genre de code

j'ai réussi à faire cela, bon cela boucle plusieurs fois mais je n'arrive pas à garder les variables accessibles
$reponse = $bdd->query('SELECT date_newletter, COUNT(*) AS nb FROM newletter GROUP BY date_newletter ORDER BY date_newletter');
while ($data3 = $reponse->fetch())
						 {?>

							<?php
							for ($mois = 1; $mois <= 12; $mois++){
							if ($mois<10) {
							$mois="0".$mois;
							}
							
							$count17 = 'count_17_'.$mois;
							echo $count17 .' <br />';
						if('2017-'.$mois.'-01'== $data3['0']) { $count17 = 1;} else {$count17 = 0;} 
						echo $data3['0'].': n°' . $mois .' : '. $count17 .' <br />';
						}
				}
mon but étant de determiné les mois où il y a une news pour la suite du code qui se composerai comme ceci
<?php 
						if(($count_17_12)==0)
						{ ?>
							<li class="<?php if ($tab == '12' ) { echo 'current'; } ?> li-tabsnews vide"><a href="#tab-2017-12">Déc.</a></li>
						<?Php
						}
						else
						{ ?>
							<li class="<?php if ($tab == '12' ) { echo 'current'; } ?> li-tabsnews"><a href="#tab-2017-12">Déc.</a></li>
						<?php	
						}
						?> 

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

30 nov. 2017, 19:38

Dans l'ordre, voila comment je le ferai :
- Il faut que tu fasses d'abord ta requête SQL
- Ensuite tu construits un tableau avec pour chaque ligne de résultat avec la date en clé du tableau => la valeur
- Enfin tu fais une boucle de 1 à 12 dans laquelle tu testes avec array_key_exists() si tu as la valeur dans ton tableau précédent, si c'est le cas tu l'affiches, sinon tu affiches 0

A toi de développer chaque brique fonctionnelle une par une, et quand chacune marchera tu les assembles :)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 19 Messages

01 déc. 2017, 12:39

Merci à toi pour cette aide que tu m'a apporté,
j'ai fini par y arriver.

voici donc mon code final :
					<?php 
					$reponse = $bdd->query('SELECT date_newletter, COUNT(*) AS nb FROM newletter GROUP BY date_newletter ORDER BY date_newletter');
					
					$mois_actif = array();
					while ($data = $reponse->fetch()) 
					 {
						$mois_actif [$data['0']] = $data['1'];
					 }
					
					for ($mois = 1; $mois <= 12; $mois++){
					if ($mois<10) {
					$mois="0".$mois;
					}
					$count17 = 'count_17_'.$mois;
					
					if (array_key_exists('2017-'.$mois.'-01', $mois_actif)) {
						${"count_17_" . $mois} = 1;
					}
					else {
						${"count_17_" . $mois} = 0;
						}
					}
					?>