comment additionner des résultats après trois requêtes

comment additionner des résultats après trois requêtes - PHP - Programmation

Marsh Posté le 19-03-2009 à 13:53:43    

Bonjour à tous.
 
Après avoir longuement tourné en rond, je vous soumets le problème qui me turlupine depuis plusieurs jours.
 
J'ai trois requêtes différentes, qui vont chercher des infos dans la même base d'un site de type site marchand. Pour plus de clarté, les voici :
 

Code :
  1. $sql="SELECT article.id_article, article.titre, historique.id_article, historique.bar_code, historique.date_envoie, COUNT(historique.priorite) AS somme FROM article, historique WHERE article.id_article = historique.id_article AND historique.bar_code LIKE 'PDR%' AND historique.date_envoie >= '$ds1' AND historique.date_envoie <= '$ds2' GROUP BY historique.id_article ORDER BY somme DESC";
  2. $sql2="SELECT article.id_article, article.titre, en_cours.id_article, en_cours.date_envoie, article_stock.id_article, article_stock.bar_code, article_stock.id_client, en_cours.id_client, COUNT(en_cours.priorite) AS somme FROM article, en_cours, article_stock WHERE article.id_article = en_cours.id_article AND article_stock.id_article = article.id_article AND article_stock.id_client = en_cours.id_client AND article_stock.bar_code LIKE 'PDR%' AND en_cours.date_envoie >= '$ds1' AND en_cours.date_envoie <= '$ds2' GROUP BY en_cours.id_article ORDER BY somme DESC";
  3. $sql3="SELECT article.id_article, article.titre, article_retard.id_article, article_retard.date_envoi, article_stock.id_article, article_stock.bar_code, article_stock.id_client, article_retard.id_client, COUNT(article_retard.statut) AS somme FROM article, article_retard, article_stock WHERE article.id_article = article_retard.id_article AND article_stock.id_article = article.id_article AND article_stock.id_client = article_retard.id_client AND article_retard.date_envoi >= '$ds1' AND article_retard.date_envoi <= '$ds2' GROUP BY article_retard.id_article ORDER BY somme DESC";


 
$ds1 et $ds2 sont des dates du formulaire de la page de la requête, pour que l'internaute puisse déterminer une période à étudier. Les trois requêtes ont pour but de lister le nombre de fois qu'un article a été prêté sur une période donnée, et il y a trois requêtes différentes car les produits sont répartis dans des tables différentes selon les critères : ceux qui sont en stock sur place, ceux qui sont prêtés, et ceux qui sont prêtés mais en retard. Pourquoi c'est réparti ainsi, je ne sais pas : j'ai récupéré la base et le site développés ainsi.  
 
Pour en revenir à mes requêtes, celles-ci marchent très bien. Les calculs sont bons, et j'obtiens des genres de "top prêt" : après chaque requête, je fais un while pour afficher une liste avec le nom, le numéro de l'article, le total "somme" pour chaque article, sans problème.  
 
Ce que je cherche à faire, c'est faire le total de ces "sommes" pour chaque article, car certains articles de la liste de la requête 2 ($sql2) se trouvent aussi dans la liste de la requête 1 ($ql), et/ou la requête 3 ($sql3).
Par exemple, dans les résultats de la requête 1 : j'ai "Livre Le Rouge et le noir" qui a une "somme" de 3 et un ID de 221, mais j'ai aussi dans ma requête 2 ces mêmes "Livre Le Rouge et le noir" avec une "somme" de 5 et toujours le même ID de 221. Par contre, je peux avoir "Les Trois mousquetaires" avec une somme de 2 et un ID de 153 uniquement dans les résultats de la requête 1.
Et j'ai besoin d'avoir "Livre Le Rouge et le noir" : 8 (3+5).
 
J'ai tenté plusieurs façons de faire, sans succès, et comme je ne suis malheureusement pas développeuse de formation, je tourne en rond.  
Je pense qu'on peut faire quelque chose avec le fait que l'ID est en commun, mais je n'arrive pas à déterminer quelle est la meilleure piste à suivre : essayer de faire une méga-requête qui joindrait tout ça, ou calculer ça ensuite avec php d'une manière que je n'ai pas encore trouvée.
 
En résumé, un petit coup de pouce me serait bien utile pour m'éviter de passer encore des heures et des heures sur la mauvaise piste...!  
Merci par avance aux bonnes âmes qui passeraient par là.
 
 
 
 

Reply

Marsh Posté le 19-03-2009 à 13:53:43   

Reply

Marsh Posté le 19-03-2009 à 14:18:52    

Si ton SGBD gère les unions, il te suffit de faire une union des trois requêtes et de n'afficher que les résultats distincts.

Reply

Marsh Posté le 19-03-2009 à 14:36:35    

Simplifie tes requêtes ! Là, elles sont illisible !
 
Je suis sûr qu'on peut facilement ne faire qu'une requête plutôt que ces trois-ci. Mais il faut commencer par les simplifier !
 
Premièrement : utiliser les jointures.
 
Edit : voici la 1ère requête réécrite :

Code :
  1. SELECT a.id_article, a.titre, h.bar_code, h.date_envoie, COUNT(h.priorite) AS somme
  2.  
  3. FROM article a INNER JOIN historique h ON a.id_article = h.id_article
  4.  
  5. WHERE historique.bar_code LIKE 'PDR%' AND
  6.     historique.date_envoie BETWEEN '$ds1' AND '$ds2'
  7.     
  8. GROUP BY a.id_article, a.titre, h.bar_code, h.date_envoie
  9.  
  10. ORDER BY somme DESC


 
C'est pas plus lisible déjà ?
Petits détails :
- j'ai sélectionné tous les champs que tu avais sélectionné, mais dans le SELECT, ne liste que les champs dont tu as besoin. Inutile, par exemple, de sélectionner le bar_code si tu ne l'affiche pas ensuite. Rien ne t'empêche de l'utiliser ensuite dans le WHERE, même s'il n'est pas dans le select !
- Ta clause group by doit regrouper tous les champs de ton select qui ne sont pas des aggrégats


Message édité par kao98 le 19-03-2009 à 14:42:37

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 19-03-2009 à 15:09:13    

Merci pour vos réponses.  
C'est vrai que j'ai tendance à ne pas revenir à la ligne dans les requêtes (je le fais pourtant dans le php et l'html...). Et à ne pas utiliser JOIN, il faut que je me documente là-dessus pour savoir bien l'employer. Et sur union.
Le bar_code, je crois que c'est un reste d'un essai où j'affichais aussi les codes barres, sans grouper.
Pourquoi est-ce que GROUP BY doit regrouper tous ces champs ? A quoi ça sert ?
Utiliser "a.id_article" redire le nom de la table en entier fait-il une différence sur le traitement de la requête ?
Désolée pour ces questions qui peuvent peut-être sembler naïves... je vais donc retravailler mes requêtes en suivant ces conseils. Et continuer à travailler sur une requête qui mélange l'ensemble plutôt que de tenter de faire un truc en php peut-être plus lourd.

Reply

Sujets relatifs:

Leave a Replay

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