Requête SQL pour MySql

Requête SQL pour MySql - PHP - Programmation

Marsh Posté le 26-01-2004 à 14:17:03    

   Voilà, je n'arrive pas à avoir le bon résultat (les infos que je veux obtenir) en ne faisant qu'une seule requête SQL dans un script PHP. Le sgbd est MySql.
 
Bon, je vous décris les qq tables qui nous intéressent :
- AOW : contient des demandes de support (help-desk). Y'a entre autres, les champs "AowSujet", "AowID", "ClientID" (celui qui a soumis la demande), "ProjetID"
 
- Historique : contient les changements d'états des demandes. Y'a les champs "HistoID", "AowID", "StatusID", "HistoDate"
 
- Status : contient les différents statuts que peuvent prendre une demande. Y'a les champ "StatusID" et "NomStatus". Comme statuts, on a, par ex, "Sousmise" (= ouverture ou création de la demande), "prise en compte", "en attente", "fermée", etc.
 
- Projets : contient les projets auxquelles sont rattachées les demandes. Y'a "ProjetID" et "NomProjet"
 
Le but de la requête, c'est d'afficher, pour un client donné (dans le contexte, c'est le client qui est loggué qui veut voir l'état d'avancée de ses demandes), chacune de ses demandes, et pour chaque demande, avoir les infos suivantes :  
- ID de la demande,
- le sujet,
- le nom du projet,
- la date d'ouverture,
- la date du dernier changement de status
- le nom du dernier status
 
Mon problème, c'est que j'arrive bien à récupérer le ID du dernier status, mais le libellé ne correspondant pas ; j'ai à la place, le libellé "Soumise", c-à-d le nom du status correspondant à la date d'ouverture :(
 
qq pourrait m'aider, svp? Merci beaucoup

Reply

Marsh Posté le 26-01-2004 à 14:17:03   

Reply

Marsh Posté le 27-01-2004 à 09:30:09    

up...

Reply

Marsh Posté le 27-01-2004 à 09:44:59    

donne-nous ta reqûete au moins...
 

Citation :

mais le libellé ne correspondant pas ; j'ai à la place, le libellé "Soumise

--> jointure ?


Message édité par jagstang le 27-01-2004 à 09:45:19
Reply

Marsh Posté le 27-01-2004 à 10:23:49    

Voici ma requête :  

Code :
  1. SELECT a.AowID, a.AowRef, a.AowSubject, p.ProjectName, MIN(h.AowStatusHistoryDate) AS minDate, MAX(h.AowStatusHistoryDate) AS maxDate, MAX(st.AowStatusID) AS maxStatusID FROM Aow a, Projects p, AowStatusHistory h, AowStatus st WHERE a.CustomerID = ".$_SESSION["CustomerID"]." AND a.ProjectID = p.ProjectID AND h.AowID = a.AowID AND h.AowStatusID = st.AowStatusID GROUP BY a.AowID ORDER BY $StrOrderBy LIMIT $StartIndex, $EndIndex


 
ps : normalement, à la base, y'avait le champ "st.AowStatusName" à la place du MAX(st.AowStatusID) AS maxStatusID dans le SELECT.

Reply

Marsh Posté le 27-01-2004 à 10:25:49    

JagStang a écrit :

donne-nous ta reqûete au moins...
 

Citation :

mais le libellé ne correspondant pas ; j'ai à la place, le libellé "Soumise

--> jointure ?


 
Mon équi-jointure est faite, mais c'est le lien (AowStatusID, AowStatusName) qui se fait mal (alors que les 2 champs sont dans la même table)...

Reply

Marsh Posté le 27-01-2004 à 10:28:04    

En fait, dans ma requête que j'ai postée précédemment, si j'arrivais à lui faire comprendre que je veux récupérer le libellé du status correspondant maxStatusID...

Reply

Marsh Posté le 27-01-2004 à 10:46:35    

Au fait, j'avais essayé de résoudre mon pb avec une requête imbriquée, mais ça marche pas : erreur à l'exécution. Est-ce-que mysql sait faire des requêtes imbriquées???

Reply

Marsh Posté le 27-01-2004 à 13:29:26    

up

Reply

Marsh Posté le 27-01-2004 à 21:10:42    

mysql ne peut pas faire des sous-requêtes avant la version 4.1.
Il te faut utiliser des left join  
 
doc : http://www.nexen.net/docs/mysql/an [...] s+requetes

Reply

Marsh Posté le 28-01-2004 à 09:49:15    

jagstang a écrit :

mysql ne peut pas faire des sous-requêtes avant la version 4.1.
Il te faut utiliser des left join  
 
doc : http://www.nexen.net/docs/mysql/an [...] s+requetes


 
Sur mon pb, j'ai du mal à voir comment utiliser le left join. Les ex donnés sur le site sont assez triviaux...

Reply

Marsh Posté le 28-01-2004 à 09:49:15   

Reply

Marsh Posté le 29-01-2004 à 10:26:05    

up :hello:

Reply

Marsh Posté le 29-01-2004 à 10:35:04    

Tu pourrais pas faire 2 requetes en utilisant le resultat de la 1ere dans la 2eme au lieu de faire une sous requete?

Reply

Marsh Posté le 29-01-2004 à 13:15:18    

impulse a écrit :

Tu pourrais pas faire 2 requetes en utilisant le resultat de la 1ere dans la 2eme au lieu de faire une sous requete?


 
Pourquoi pas, mais je sais pas faire en php, lancer une nouvelle requête sql sur le résultat d'une requête précédente...
 
Sinon, y'a vraiment pas moyen de le faire en 1 seule requête :??:


Message édité par rufo le 29-01-2004 à 13:15:34
Reply

Marsh Posté le 29-01-2004 à 13:37:01    

rufo a écrit :


 
Pourquoi pas, mais je sais pas faire en php, lancer une nouvelle requête sql sur le résultat d'une requête précédente...


Bé tu utilises les variables résultant de ta première requête dans la 2ème...

Reply

Marsh Posté le 29-01-2004 à 13:46:04    

Hum, j'avais pas regarde ta requete. En fait tu ne devrais meme pas avoir besoin de faire plusieurs requetes si ça se trouve.

Reply

Marsh Posté le 29-01-2004 à 13:50:05    

rufo a écrit :


Mon problème, c'est que j'arrive bien à récupérer le ID du dernier status, mais le libellé ne correspondant pas ; j'ai à la place, le libellé "Soumise", c-à-d le nom du status correspondant à la date d'ouverture :(


 
C'est pas tres clair... Tu es sur que tu as le bon ID? Si c'est la cas essaye de modifier ta requete comme ceci :
 

Code :
  1. h.AowStatusID = st.AowStatusID


 

Code :
  1. st.AowStatusID = maxStatusID

Reply

Marsh Posté le 29-01-2004 à 13:59:35    

Si ça marche pas tu fais 2 requetes. Tu utilises le maxStatusID renvoye par la 1ere requete et tu l'utilises dans la 2e requete.

Reply

Marsh Posté le 29-01-2004 à 14:43:20    

impulse a écrit :


 
C'est pas tres clair... Tu es sur que tu as le bon ID? Si c'est la cas essaye de modifier ta requete comme ceci :
 

Code :
  1. h.AowStatusID = st.AowStatusID


 

Code :
  1. st.AowStatusID = maxStatusID




 
j'avais déjà essayé ce truc, mais ça marche pas. Normal, maxStatusID ne prend sa valeur q'une fois la requête terminée...

Reply

Marsh Posté le 29-01-2004 à 14:44:33    

impulse a écrit :

Si ça marche pas tu fais 2 requetes. Tu utilises le maxStatusID renvoye par la 1ere requete et tu l'utilises dans la 2e requete.


 
C'est ce que j'ai fait. Mais je pense que c'est possible de faire ça en 1 requête... (oui, je sais, j'y tiens à faire ça en 1 requête:))...

Reply

Marsh Posté le 29-01-2004 à 14:54:57    

rufo a écrit :


 
C'est ce que j'ai fait. Mais je pense que c'est possible de faire ça en 1 requête... (oui, je sais, j'y tiens à faire ça en 1 requête:))...


 
Tu tiens vraiment a te compliquer la vie en fait...
Si tu insistes tu n'as qu'a prendre la version alpha de MySQL.

Reply

Marsh Posté le 29-01-2004 à 16:28:11    

impulse a écrit :


 
Tu tiens vraiment a te compliquer la vie en fait...
Si tu insistes tu n'as qu'a prendre la version alpha de MySQL.


 
Pas tellement, mais si je ne le fais aps en une requête, je vais en faire x (autant que la première requête va me renvoyer de résultats) pour récupérer le statutName... :( Donc, si y'a beaucoup de résultats, ça va faire beaucoup de requêtes, et donc, ça va être plus lent...

Reply

Marsh Posté le 29-01-2004 à 16:44:39    

Pour éviter de faire plusieurs requetes tu en fais une seule qui te renvois l'historiques des statuts et c'est ensuite dans ton code que tu garde que les lignes qui t'intéresse.


Message édité par ratibus le 29-01-2004 à 16:45:10
Reply

Marsh Posté le 30-01-2004 à 08:26:51    

rufo a écrit :


 
Pas tellement, mais si je ne le fais aps en une requête, je vais en faire x (autant que la première requête va me renvoyer de résultats) pour récupérer le statutName... :( Donc, si y'a beaucoup de résultats, ça va faire beaucoup de requêtes, et donc, ça va être plus lent...


 
Et en utilisant une sous-requete tu fais pas exactement la meme chose? 2 select a la suite ou 1 select imbriqué dans un autre je suis pas sur que ce soit vraiment different...

Reply

Marsh Posté le 30-01-2004 à 08:49:13    

impulse a écrit :


 
Et en utilisant une sous-requete tu fais pas exactement la meme chose? 2 select a la suite ou 1 select imbriqué dans un autre je suis pas sur que ce soit vraiment different...


 
pb pour le select imbriqué : ma version de MySQl ne le prend pas en charge (et j'ai pas trop dans quelle mesure je peux changer de version)
 
Pour faire une seconde requête à partir du résultat de la première, faudrait me montrer comment on fait... Merci :)

Reply

Marsh Posté le 30-01-2004 à 09:04:22    

rufo a écrit :


 
pb pour le select imbriqué : ma version de MySQl ne le prend pas en charge (et j'ai pas trop dans quelle mesure je peux changer de version)


 
Oui oui je sais que les sous requetes ne fonctionnent pas avec ta version de MySQL. Je te dis juste que meme si tu pouvais les utiliser je ne suis pas sur que ça soit plus rapide d'effectuer 2 select inbriqués plutot que 2 select dans 2 requetes differentes. Et ds tous les cas pour resoudre ton pb il faut que tu fasses 2 select.
 

Citation :


Pour faire une seconde requête à partir du résultat de la première, faudrait me montrer comment on fait... Merci :)


 
C'est pas compliqué. Tu executes ta premiere requete :
 

Code :
  1. SELECT a.AowID, a.AowRef, a.AowSubject, p.ProjectName, MIN(h.AowStatusHistoryDate) AS minDate, MAX(h.AowStatusHistoryDate) AS maxDate, MAX(st.AowStatusID) AS maxStatusID FROM Aow a, Projects p, AowStatusHistory h, AowStatus st WHERE a.CustomerID = ".$_SESSION["CustomerID"]." AND a.ProjectID = p.ProjectID AND h.AowID = a.AowID AND h.AowStatusID = st.AowStatusID GROUP BY a.AowID ORDER BY $StrOrderBy LIMIT $StartIndex, $EndIndex;


 
tu recuperes ton maxStatusId dans $maxStatusId par exemple et ensuite une 2eme qui devrait ressembler a ça :
 

Code :
  1. SELECT NomStatus FROM AowStatus WHERE AowStatusID = $maxStatusId;


 
Si j'ai bien compris ce que tu veux faire, ces 2 requetes devraient te donner le resultat escompté.

Reply

Marsh Posté le 30-01-2004 à 09:14:08    

Oui, ça me donne bien le résultat attendu............ mais pour le premier enregistrement retourné par la première requête... Pour que ça marche avec tous les résultats renvoyés par la première requête, il faut que je mette la 2ème requête à l'intérieur d'une boucle qui affiche chaque enregistrement de la première requête... Chose que j'ai fait. La solution que tu viens de me donner est celel que j'ai actuellement mise en place :)
 
Là où je suis d'accord avec toi, 1 select imbriqué n'est aps plus rapide que 2 requêtes faites à la suite.
 
En gros, je suis pour 1 requête SQL voire, 2 (la seconde récupérant le résultat dans sa globalité de la première, mais en résolvant mon pb statusID couplé au bon statusName), mais je suis contre 1 première requête puis une 2ème requête  qui se trouverait dans une boucle, puisque dans ce cas là, j'aurais pleins de requêtes à exécuter, mais certes 2 à écrire...

Reply

Marsh Posté le 30-01-2004 à 09:41:14    

rufo a écrit :

Oui, ça me donne bien le résultat attendu............ mais pour le premier enregistrement retourné par la première requête... Pour que ça marche avec tous les résultats renvoyés par la première requête, il faut que je mette la 2ème requête à l'intérieur d'une boucle qui affiche chaque enregistrement de la première requête... Chose que j'ai fait. La solution que tu viens de me donner est celel que j'ai actuellement mise en place :)
 
Là où je suis d'accord avec toi, 1 select imbriqué n'est aps plus rapide que 2 requêtes faites à la suite.
 
En gros, je suis pour 1 requête SQL voire, 2 (la seconde récupérant le résultat dans sa globalité de la première, mais en résolvant mon pb statusID couplé au bon statusName), mais je suis contre 1 première requête puis une 2ème requête  qui se trouverait dans une boucle, puisque dans ce cas là, j'aurais pleins de requêtes à exécuter, mais certes 2 à écrire...


 
Ok, je vois ce que tu veux dire maintenant.
 
Ce que tu peux faire c'est creer un tableau statusID - nomStatus  comme ça tu executes une seule requete pour trouver le nom qd tu as l'id =>
 

Code :
  1. SELECT * FROM AowStatus;


 
Tu mets le resultat dans un tableau en ensuite il suffit de recuperer la valeur (nom status) qui correspond a la cle (status id). Je crois que c'est la solution la plus simple. Si ça ne te convient pas il va falloir que tu essayes de reformuler ta query pour "emuler" les sub-queries => http://www.mysql.com/documentation [...] subqueries
ou bien installer la version 4.1 de MySQL...


Message édité par impulse le 30-01-2004 à 09:41:32
Reply

Marsh Posté le 30-01-2004 à 10:15:53    

Tiens, je sais pas si c'est exactement la même idée que toi, mais je pense que si : faire une requête qui charge dans un tableau associatif array(StatusID => StatusName) les ID et els noms des status (oui, si jamais des status ont été supprimés, les ID ne seront plus consécutifs et ils ne pourront donc pas servir dans un tableau indexé genre $tab[$id] = $StatusName)
et dans une seconde requête, faire celle que j'avais déjà. Ca fait bien 2 requêtes écrites ET exécutées. Et vu que la table des status ne sera pas trop grosse (genre 10 status à vue de nez), c'est pas trop pénalisant :)
 
Merci pour l'idée :hello:

Reply

Marsh Posté le 30-01-2004 à 10:20:55    

Pour le left join, jagstang m'avait déjà filé un lien, mais j'ai pas réussi à trouver une formulation de ma requête l'utilisant.

Reply

Marsh Posté le 30-01-2004 à 10:37:17    

rufo a écrit :

Tiens, je sais pas si c'est exactement la même idée que toi, mais je pense que si : faire une requête qui charge dans un tableau associatif array(StatusID => StatusName) les ID et els noms des status (oui, si jamais des status ont été supprimés, les ID ne seront plus consécutifs et ils ne pourront donc pas servir dans un tableau indexé genre $tab[$id] = $StatusName)
et dans une seconde requête, faire celle que j'avais déjà. Ca fait bien 2 requêtes écrites ET exécutées. Et vu que la table des status ne sera pas trop grosse (genre 10 status à vue de nez), c'est pas trop pénalisant :)
 
Merci pour l'idée :hello:  


 
Oui c'est ça l'idee. Niveau perf il ne devrait pas y avoir de pb,  suivant le nombre de demandes je pense meme que ça peut etre plus rapide que la "solution sub-queries". :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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