Pb de sous-rêquete: retour de valeurs multiples

Kariboo
Invité n'ayant pas de compte PHPfrance

01 juin 2006, 22:48

Bonsoir,

J'ai un problème d'optimisation de requête: En fait, je souhaite utiliser une sous-requête et retourner plusieurs valeurs (colonnes).

Exemple:

Code : Tout sélectionner

SELECT * FROM pseudo WHERE age > (SELECT age FROM pseudo WHERE idPseudo=2) and taille > (SELECT taille FROM pseudo WHERE idPseudo=2)
Comment faire pour supprimer les deux sous-requêtes et les remplacer par une seule?

Si vous avez une bonne idée, je suis preneur :)
Merci d'avance.

Kariboo

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

01 juin 2006, 22:53

Commence par lire ça: Se passer des sous-requêtes avec les premières versions de MySQL. Et puis tant que tu es dans le manuel, reprends le chapitre sur SELECT et comment écrire une jointure. Sans oublier le tutoriel. Après, tu devrais être en mesure de réécrire ta requête sous cette forme:

Code : Tout sélectionner

SELECT p1.* FROM pseudo p1 JOIN pseudo p2 ON p2.idPseudo = 2 WHERE p1.age > p2.age AND p1.taille > p2.taille
Ou alors comme ça, c'est sous cette forme que la requête est présentée par le manuel de MySQL, mais en dehors de la syntaxe les deux requêtes sont strictement identiques:

Code : Tout sélectionner

SELECT p1.* FROM pseudo p1, pseudo p2 WHERE p2.idPseudo = 2 AND p1.age > p2.age AND p1.taille > p2.taille

Kariboo
Invité n'ayant pas de compte PHPfrance

01 juin 2006, 22:58

Merci beaucoup pour la réponse rapide.

En fait, je fais déjà des jointures dans ma requête compléte :) , je comptais faire une sous-requête pour alléger l'écriture et surtout la génération en PHP.

Si j'ai pas d'autre choix, je vais me lancer (mais demain, après une bonne nuit:) )

Kariboo

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

01 juin 2006, 23:07

je comptais faire une sous-requête pour alléger l'écriture et surtout la génération en PHP
Je ne suis pas certain de comprendre, en quoi ça interfère avec la génération en PHP ? il s'agit avant tout du fonctionnement interne de MySQL, tout ce que PHP voit c'est le résultat (ce qu'on a mis dans "SELECT").

Au fait, en me relisant je me suis aperçu que je ne faisais pas la jointure dans le bon sens. En pratique ça ne change rien parce que le serveur remets les tables dans le bon ordre, mais c'est important à garder en tête, surtout que plus grand est le nombre de jointures et plus dur c'est pour le serveur de trouver le bon ordre. En règle générale, le "bon ordre" c'est de partir de la table dont on connait le champs d'application de la clause "WHERE" et joindre la table dont le champs d'application dépend de la première. En d'autres termes, il y a une table où le seul enregistrement qui nous intéresse correspond à "idPseudo = 2" et une autre qui dépend des informations contenu dans la première.

On part de p1 et on cherche les informations dans p2 donc la requête devrait ressembler à:

Code : Tout sélectionner

SELECT p2.* FROM pseudo p1 JOIN pseudo p2 ON (p2.age > p1.age AND p2.taille > p1.taille) WHERE p1.idPseudo = 2