Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1709 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Requête SQL pour MySql

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requête SQL pour MySql

n°621860
rufo
Pas me confondre avec Lycos!
Posté le 26-01-2004 à 14:17:03  profilanswer
 

   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

mood
Publicité
Posté le 26-01-2004 à 14:17:03  profilanswer
 

n°622518
rufo
Pas me confondre avec Lycos!
Posté le 27-01-2004 à 09:30:09  profilanswer
 

up...

n°622529
jagstang
Pa Capona ಠ_ಠ
Posté le 27-01-2004 à 09:44:59  profilanswer
 

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
n°622550
rufo
Pas me confondre avec Lycos!
Posté le 27-01-2004 à 10:23:49  profilanswer
 

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.

n°622552
rufo
Pas me confondre avec Lycos!
Posté le 27-01-2004 à 10:25:49  profilanswer
 

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)...

n°622553
rufo
Pas me confondre avec Lycos!
Posté le 27-01-2004 à 10:28:04  profilanswer
 

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...

n°622578
rufo
Pas me confondre avec Lycos!
Posté le 27-01-2004 à 10:46:35  profilanswer
 

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???

n°622778
rufo
Pas me confondre avec Lycos!
Posté le 27-01-2004 à 13:29:26  profilanswer
 

up

n°623082
jagstang
Pa Capona ಠ_ಠ
Posté le 27-01-2004 à 21:10:42  profilanswer
 

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

n°623531
rufo
Pas me confondre avec Lycos!
Posté le 28-01-2004 à 09:49:15  profilanswer
 

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...

mood
Publicité
Posté le 28-01-2004 à 09:49:15  profilanswer
 

n°624603
rufo
Pas me confondre avec Lycos!
Posté le 29-01-2004 à 10:26:05  profilanswer
 

up :hello:

n°624612
impulse
Posté le 29-01-2004 à 10:35:04  profilanswer
 

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

n°624832
rufo
Pas me confondre avec Lycos!
Posté le 29-01-2004 à 13:15:18  profilanswer
 

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
n°624844
deliriumtr​emens
sic transit intestinal...
Posté le 29-01-2004 à 13:37:01  profilanswer
 

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...

n°624849
impulse
Posté le 29-01-2004 à 13:46:04  profilanswer
 

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

n°624855
impulse
Posté le 29-01-2004 à 13:50:05  profilanswer
 

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

n°624867
impulse
Posté le 29-01-2004 à 13:59:35  profilanswer
 

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.

n°624917
rufo
Pas me confondre avec Lycos!
Posté le 29-01-2004 à 14:43:20  profilanswer
 

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...

n°624920
rufo
Pas me confondre avec Lycos!
Posté le 29-01-2004 à 14:44:33  profilanswer
 

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:))...

n°624936
impulse
Posté le 29-01-2004 à 14:54:57  profilanswer
 

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.

n°625057
rufo
Pas me confondre avec Lycos!
Posté le 29-01-2004 à 16:28:11  profilanswer
 

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...

n°625073
ratibus
Posté le 29-01-2004 à 16:44:39  profilanswer
 

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
n°625682
impulse
Posté le 30-01-2004 à 08:26:51  profilanswer
 

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...

n°625697
rufo
Pas me confondre avec Lycos!
Posté le 30-01-2004 à 08:49:13  profilanswer
 

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 :)

n°625705
impulse
Posté le 30-01-2004 à 09:04:22  profilanswer
 

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é.

n°625712
rufo
Pas me confondre avec Lycos!
Posté le 30-01-2004 à 09:14:08  profilanswer
 

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...

n°625727
impulse
Posté le 30-01-2004 à 09:41:14  profilanswer
 

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
n°625759
rufo
Pas me confondre avec Lycos!
Posté le 30-01-2004 à 10:15:53  profilanswer
 

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:

n°625765
rufo
Pas me confondre avec Lycos!
Posté le 30-01-2004 à 10:20:55  profilanswer
 

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.

n°625774
impulse
Posté le 30-01-2004 à 10:37:17  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Requête SQL pour MySql

 

Sujets relatifs
passage de php/mysql vers php/access : problemes [resolu][DELPHI] requete SQL : comment préciser la table de recherche ?
[PHP] Connexion à MySQL[MySQL] Récupérer la liste des tables
[SQL]J'arrive pas à trouver ma requête![SQL] "outer join" et "sum", "min": requête problematique
bug de ASP - SQL serveur ?? tabulations et espaces aléatoires...[MySQL] - Requete SQL sur 3 tables + 2 count... ca foire a moitier
[MySQL] Faire un rand sur une requete SQL...SQL / MySQL : requete en employant un <> like
Plus de sujets relatifs à : Requête SQL pour MySql


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR