Cascade de requête sql pour un système d'archivage [résolu]

Cascade de requête sql pour un système d'archivage [résolu] - PHP - Programmation

Marsh Posté le 20-03-2013 à 03:37:17    

Bonjour à tous \o/
 
J'ai un petit soucis au sujet d'une partie de mon code. Il fonctionne comme je le souhaite, cependant j'aimerais savoir s'il n'existe pas une meilleur façon de faire.
En gros j'ai une table remplis d'entrées contenant 4 variables : ID, titre, contenu, et date.
Pour un système d'archivage intelligent j'aimerais un affichage de ce genre :
 
--12 - titre5
--02 - titre4
-Janvier
2013
--21 - titre 3
-Décembre
2012
--16 -titre2
--03 -titre1
-Octobre
2011
(toutes ces valeurs sont à titre d'exemple)
 
Du coup j'ai réalisé ce code (sans les "--" ) :

Code :
  1. $extraire1 = $bdd->query("SELECT YEAR(date) AS annee FROM GSP_Art GROUP BY annee DESC" );
  2. while ($data1 = $extraire1->fetch())
  3. {
  4. $annee = $data1['annee'];
  5. $extraire2 = $bdd->query("SELECT YEAR(date) AS annee, MONTH(date) AS mois FROM GSP_Art GROUP BY mois DESC HAVING annee=$annee" );
  6. while ($data2 = $extraire2->fetch())
  7. {
  8.  $mois = $data2['mois'];
  9.  $moistr = moistr($mois); //Fonction qui traduis le numéro du mois en nom
  10.  $extraire3 = $bdd->query("SELECT titre, MONTH(date) AS mois, DAY(date) AS jour FROM GSP_Art GROUP BY jour DESC HAVING mois=$mois" );
  11.  while ($data3 = $extraire3->fetch())
  12.  {
  13.   $titre = $data3['titre'];
  14.   $jour = $data3['jour'];
  15.   echo "$jour - $titre</br>";
  16.  }
  17.  echo "$moistr</br>";
  18. }
  19. echo "$annee</br>";
  20. }
  21. $extraire1->closeCursor();
  22. $extraire2->closeCursor();
  23. $extraire3->closeCursor();


 
Qui fait son boulot... Enfin presque il reste une petite subtilité dans le cas de plusieurs articles le même jour... Mais j'aimerais savoir si je ne peux pas directement récupérer puis ordonner et grouper les résultats d'une seule requête pour par la suite obtenir le même affichage que précédemment.
Merci de m'avoir lu et merci pour de potentielles réponses =)


Message édité par klemorius le 23-03-2013 à 15:15:38
Reply

Marsh Posté le 20-03-2013 à 03:37:17   

Reply

Marsh Posté le 21-03-2013 à 03:36:05    

up

Reply

Marsh Posté le 21-03-2013 à 20:32:40    

En effet faire des select dans des boucles n'est pas vraiment l'idéal, il est préférable de traiter les résultat avec php.
 
En gros tu fais juste ta sélection avec un order by desc sur ta date, puis lors de ta boucle while, il suffit de tester si l'année change, idem pour le mois.

Reply

Marsh Posté le 22-03-2013 à 10:48:16    

+1 pour la solution de Bistouille. Un sgbd, c'est fait pour filtrer, un langage de programmation, pour traiter le résultat filtré.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-03-2013 à 15:12:38    

Problème résolu ! En fait j'ai fini par avoir un indice sur le forum du SDZ et j'ai produis ceci :
 

Code :
  1. $annee_av = 2113;
  2. $extraire = $bdd->query("SELECT id, titre, YEAR(date) AS annee, MONTH(date) AS mois, DAY(date) AS jour, DATE_FORMAT(date, '%H%i%s') AS heure FROM GSP_Art ORDER BY id DESC" );
  3. while($data = $extraire->fetch())
  4. {
  5.     $annee = $data['annee'];
  6.     $mois = $data['mois'];
  7.     $jour = $data['jour'];
  8.     $heure = $data['heure'];
  9.     $titre = $data['titre'];
  10.     if($annee < $annee_av)
  11.     {
  12.         echo "$annee</br>";
  13.         $mois_av = 13;
  14.         $annee_av = $annee;
  15.     }
  16.     if($mois < $mois_av)
  17.     {
  18.         echo "-$mois</br>";
  19.         $jour_av = 32;
  20.         $mois_av = $mois;
  21.     }
  22.     if($jour < $jour_av)
  23.     {
  24.         echo "--$jour</br>";
  25.         $heure_av = 250000;
  26.         $jour_av = $jour;
  27.     }
  28.     if($heure < $heure_av)
  29.     {
  30.         echo "---$titre</br>";
  31.         $heure_av = $heure;
  32.     }
  33. }
  34. $extraire->closeCursor();


 
Et effectivement je suis d'accord avec vous :wahoo:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed