Requête SQL pour MySql - PHP - Programmation
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 ?
Marsh Posté le 27-01-2004 à 10:23:49
Voici ma requête :
Code :
|
ps : normalement, à la base, y'avait le champ "st.AowStatusName" à la place du MAX(st.AowStatusID) AS maxStatusID dans le SELECT.
Marsh Posté le 27-01-2004 à 10:25:49
JagStang a écrit : donne-nous ta reqûete au moins...
--> 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)...
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...
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???
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
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. |
Sur mon pb, j'ai du mal à voir comment utiliser le left join. Les ex donnés sur le site sont assez triviaux...
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?
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
Marsh Posté le 29-01-2004 à 13:37:01
rufo a écrit : |
Bé tu utilises les variables résultant de ta première requête dans la 2ème...
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.
Marsh Posté le 29-01-2004 à 13:50:05
rufo 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 :
|
Code :
|
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.
Marsh Posté le 29-01-2004 à 14:43:20
impulse a écrit :
|
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...
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)...
Marsh Posté le 29-01-2004 à 14:54:57
rufo 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.
Marsh Posté le 29-01-2004 à 16:28:11
impulse 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...
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.
Marsh Posté le 30-01-2004 à 08:26:51
rufo 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...
Marsh Posté le 30-01-2004 à 08:49:13
impulse 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)
Pour faire une seconde requête à partir du résultat de la première, faudrait me montrer comment on fait... Merci
Marsh Posté le 30-01-2004 à 09:04:22
rufo a écrit : |
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 : |
C'est pas compliqué. Tu executes ta premiere requete :
Code :
|
tu recuperes ton maxStatusId dans $maxStatusId par exemple et ensuite une 2eme qui devrait ressembler a ça :
Code :
|
Si j'ai bien compris ce que tu veux faire, ces 2 requetes devraient te donner le resultat escompté.
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...
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 |
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 :
|
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...
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
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.
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) |
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".
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