Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/04/2011, 19h06   #1
Invité régulier
 
Inscription : juillet 2004
Messages : 30
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 30
Points : 9
Points : 9
Par défaut Utiliser les résultats d'une sous-requête

Bonjour, j'ai un peu de mal avec une requête imbriquée.

Exemple :

Table_foo
IDA IDB
3---a
2---b
4---a
3---c
1---d


Table_bar
IDA NAME
1---abc
2---def
3---ghi
4---klm

Est-il possible en une seule requête de déterminer combien de fois chaque IDA de foo est utilisé, de limiter ces résultats (par exemple les deux plus gros) et de me servir de ces IDA dans la table bar afin de sélectionner les NAME correspondants tout en gardant l'info du combien de fois ?

Obtenir quelque chose comme ça :

IDA NAME n
3---ghi----2 (fois)
2---def----1 (fois)

Code :
1
2
$s2 = SELECT IDA, COUNT(*) n FROM Table_foo GROUP BY IDA ORDER BY n DESC LIMIT 2;
$s = SELECT IDA, NAME, n FROM Table_bar WHERE IDA IN ($s2);
La sous requête fonctionne mais je n'arrive pas à l'utiliser dans la première, je me heurte à l'impossibilité de mettre une limite dans une sous-requête, un nombre de champs en trop dans la sous-requête (le COUNT) ou n inconnu dans la première ...
Donc est-ce que c'est possible ?

Merci.
brice_(29) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 21h37   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
normal, le in ne ressort qu'une seule valeur de ta sous-requête, pour remplir IDA rien d'autre n'est exploité... ça te génère donc une erreur car tu renvoies 3 valeurs pour une seul à pourvoir...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 23h52   #3
Invité régulier
 
Inscription : juillet 2004
Messages : 30
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 30
Points : 9
Points : 9
J'ai besoin d'un second indice.
J'ai testé plusieurs façons et je n'y arrive pas du tout, les requêtes SQL c'est un peu comme les expressions régulières.
brice_(29) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 01h20   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
la solution peut être d'essayer avec des jointures...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 15h25   #5
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Bonjour,
Essayez en faisant tout simplement une jointure entre vos deux requêtes, cela devrait ressembler à ça :
Code :
1
2
SELECT t1.*, t2.NbIDA FROM Table_bar
INNER JOIN ( SELECT IDA, COUNT(*) AS NbIDA FROM Table_foo GROUP BY IDA ORDER BY COUNT(*) LIMIT 2 ) AS t2 ON t2.IDA = t1.IDA
Bon courage
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 22h43   #6
Invité régulier
 
Inscription : juillet 2004
Messages : 30
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 30
Points : 9
Points : 9
J'étais arrivé à quelque chose du genre, sans le INNER JOIN et ON, mais ta version est au moins 20% plus rapide, et en mettant le vrai nom de la table au lieu de l'alias pour la première table de la requête on gagne encore 12%.

Merci.
brice_(29) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 01h19   #7
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
De rien, c'est bizarre pour l'alias mais en même temps j'avais mal écrit la requête en oubliant d'indiquer l'alias de "Table_bar", corrigé ça donne :
Code :
1
2
SELECT t1.*, t2.NbIDA FROM Table_bar AS t1
INNER JOIN ( SELECT IDA, COUNT(*) AS NbIDA FROM Table_foo GROUP BY IDA ORDER BY COUNT(*) LIMIT 2 ) AS t2 ON t2.IDA = t1.IDA
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h08.


 
 
 
 
Partenaires

Hébergement Web