Page 1 sur 1

SImplification de requete

Posté : 29 nov. 2017, 18:00
par mr-frey-day
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();

Re: SImplification de requete

Posté : 29 nov. 2017, 19:00
par @rthur
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

Re: SImplification de requete

Posté : 30 nov. 2017, 10:51
par mr-frey-day
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

Re: SImplification de requete

Posté : 30 nov. 2017, 11:13
par @rthur
Erreur de ma part : le ORDER BY doit être en dernier

Re: SImplification de requete

Posté : 30 nov. 2017, 11:45
par mr-frey-day
petite question, peut-on obtenir les lignes qui sont à zero aussi?
cela m'aiderai pour l'affichage que je souhaiterai faire.

Re: SImplification de requete

Posté : 30 nov. 2017, 11:55
par @rthur
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

Re: SImplification de requete

Posté : 30 nov. 2017, 15:49
par mr-frey-day
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	
						}
						?> 

Re: SImplification de requete

Posté : 30 nov. 2017, 19:38
par @rthur
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 :)

Re: SImplification de requete

Posté : 01 déc. 2017, 12:39
par mr-frey-day
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;
						}
					}
					?>