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 11/01/2011, 11h28   #1
Membre à l'essai
 
Inscription : novembre 2009
Messages : 93
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 93
Points : 22
Points : 22
Par défaut Problème requête SQL avec plusieurs lignes retournées dans le where

Bonjour à tous,

Le titre de mon message n'est surement pas très compréhensible je vais essayer d'être plus clair.

J'ai deux tables:
OBJET avec comme champs
id, id_host, _id_type, value
Et une autre TYPE avec comme champs
id, description

le id_type de OBJET me permet de savoir quelle type d'info j'ai avec le champs id de la table TYPE.
TYPE.id = OBJET.id_type

Ma table OBJET a ce genre d'infos:
id id_host id_type value
1 1 1 nie641e
2 1 2 106A0082
3 1 3 80gff3c3
4 1 4 Sun Microsystems sun4u Sun Enterprise 220R
5 1 5 OBP 3.31.0 2001/07/25 20:31
7 1 6 1024MB
8 1 7 2
9 1 8 2/450MHz

Je voudrais par exemple récupérer toutes les infos de chaque id_host ayant comme id_type = 4 et comme valeur "Sun Microsystems".

voici ma requete:
Code :
1
2
3
4
5
 
SELECT a.value, b.description FROM objet a, type b
WHERE
id_host = (SELECT c.id_host FROM objet c WHERE c.value LIKE '%nie641e%')
AND a.id_type = b.id
La ca marche car ma requete entre parenthese renvoit qu'un seul id_host correspondant à 'nie641e'. Mais si je mets entre guillemets 'Sun Microsystems' comme y en a plusieurs ayant cette valeur elle renvoit plusieurs id_host et donc ca coince... Ce que je comprends tout à fait mais alors comment faire une moulinette qui pourrait me faire la requete pour chaque id_host retourner dans la requete entre parenthèse?

Merci d'avance pour votre aide.
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 12h07   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 985
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 985
Points : 18 232
Points : 18 232
Envoyer un message via MSN à CinePhil
Citation:
Je voudrais par exemple récupérer toutes les infos de chaque id_host ayant comme id_type = 4 et comme valeur "Sun Microsystems".
Ta phrase est ambigüe.
Dans tes données il n'y a qu'un seul id_host et une ligne de ces données correspond au besoin. Ne faut-il retourner que cette ligne ou toutes les lignes de id_host = 1 puisque l'une des lignes de ses données répond au critère ?

Que vient faire ta sous requête avec son like par rapport au besoin que tu exprimes ?

Tu peux donner le résultat attendu par rapport aux données exemple fournies ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 12h18   #3
Membre à l'essai
 
Inscription : novembre 2009
Messages : 93
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 93
Points : 22
Points : 22
Tout d'abord merci pour ta réponse

En fait, par exemple ma sous requête
Code :
(SELECT c.id_host FROM objet c WHERE c.value LIKE '%nie641e%')
Dans ce cas retourne:
id_host
5

Mais j'ai des cas (la majorité) ou cette requête va me retourner plusieurs id_host:
id_host
5
16
23
180

Donc j'ai une erreur "Subquery returns more than 1 row" ce qui normal.
Mais je voudrais pour chaque id_host retourner de la sous requête effectuer la premiere partie de la requête. En gros ca donnerait ca
Code :
1
2
SELECT a.value, b.description FROM objet a, type b
WHERE id_host = 5 AND a.id_type = b.id
Code :
1
2
SELECT a.value, b.description FROM objet a, type b
WHERE id_host = 16 AND a.id_type = b.id
Code :
1
2
SELECT a.value, b.description FROM objet a, type b
WHERE id_host = 23 AND a.id_type = b.id
etc...

Comme ca pour chaque id_host récupéré de la sous requête je récupère les infos Enfin j'aimerais bien...
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 13h34   #4
Membre du Club
 
Inscription : août 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 66
Points : 69
Points : 69
Citation:
Envoyé par Tonii Voir le message
Code :
1
2
3
4
5
 
SELECT a.value, b.description FROM objet a, type b
WHERE
id_host = (SELECT c.id_host FROM objet c WHERE c.value LIKE '%nie641e%')
AND a.id_type = b.id
Dans le cas où ta sous-requête retourne plusieurs enregistrements, il faut utiliser l'opérateur IN plutôt que "="... Ce qui donnerait :

Code :
1
2
3
4
5
 
SELECT a.value, b.description FROM objet a, type b
WHERE
id_host IN (SELECT c.id_host FROM objet c WHERE c.value LIKE '%nie641e%')
AND a.id_type = b.id
Cela risque d'être un poil mieux...
NicoD. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 16h29   #5
Membre à l'essai
 
Inscription : novembre 2009
Messages : 93
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 93
Points : 22
Points : 22
Merci c'est exactement ca!!!

Merci encore, j'ai beaucoup à apprendre!
Tonii 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 19h23.


 
 
 
 
Partenaires

Hébergement Web