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 18/01/2011, 11h07   #1
Membre expérimenté
 
Avatar de Gouyon
 
Homme Rémi Gouyon
Développeur informatique
Inscription : novembre 2003
Messages : 539
Détails du profil
Informations personnelles :
Nom : Homme Rémi Gouyon
Âge : 48
Localisation : France, Loiret (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : novembre 2003
Messages : 539
Points : 531
Points : 531
Par défaut extraire des valeurs d'une table en fonction du contenu d'une sous requete

Salut à tous

Voilà j'ai une table (t_combat) qui contient les champs suivants:
  1. RefAtt: Contient la référence à un navire qui attaque un autre.
  2. RefDef: Contient la référence du navire attaqué.

J'exécute une requête qui me donne la liste des navires qui se défendent. Et pour chacun de ses navires j'établis la liste des navires qui l'attaquent avec la requête suivante:
Code :
1
2
3
 
SELECT t_combat.RefAtt FROM t_combat
WHERE t_combat.RefDef= :rd
Maintenant à partir du résultat de cette requête je voudrais obtenir la liste des navires qui sont attaqués par le défenseur

Par exemple ma table contient:
+-------+--------+
! RefAtt ! RefDef !
+-------+--------+
! 1 ! 8 !
+-------+--------+
! 3 ! 8 !
+-------+--------+
! 4 ! 8 !
+-------+--------+
! 8 ! 3 !
+-------+--------+
! 1 ! 7 !
+-------+--------+

Le résultat de ma requête pour RefDef=8 est
RefAtt:
1
3
4
Pour avoir la liste des navires attaqué par le défenseur qui sont dans la liste de ceux qui l'attaquent (j'espère avoir été clair) Je pourrais faire une requête de ce genre
Code :
1
2
3
 
SELECT t_combat.RefDef FROM t_combat
WHERE (t_combat.RefDef= 1) OR (t_combat.RefDef= 3) OR (t_combat.RefDef= 4)
Mais comme c'est lourd je voudrais savoir s'il n'est pas possible d'écrire ça sous forme d'une seule requête?
__________________
Il y a des jours où j'éprouve une haine profonde envers microsoft
Venez vous défouler ici ou c'est amusant
Mon modeste site et mes modestes oeuvres sont
Rémi
Gouyon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 13h17   #2
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
Je ne sais pas si j'ai bien compris ton problème...

Au final, c'est la liste des navires qui sont à la fois attaquants et défenseurs envers un navire donné que tu cherches à connaître ?

Si c'est le cas, je tenterais sans optimiser :

Code :
1
2
3
4
5
6
7
8
9
 
SELECT
  t_combat.RefDef
FROM
  t_combat
WHERE
  t_combat.RefDef IN (SELECT t_combat.RefAtt FROM t_combat WHERE t_combat.RefDef= '8')
  AND t_combat.RefAtt = '8'
;
NicoD. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 13h39   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 986
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 986
Points : 18 234
Points : 18 234
Envoyer un message via MSN à CinePhil
Ça doit pouvoir se faire aussi avec une auto-jointure :
Code :
1
2
3
4
5
SELECT c1.RefAtt AS Attaquant_contré
FROM t_combat AS c1
INNER JOIN t_combat AS c2 ON c2.RefDef = c1.RefAtt
WHERE c1.RefDef = 8
    AND c2.RefAtt = 8
__________________
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 actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 07h41   #4
Membre expérimenté
 
Avatar de Gouyon
 
Homme Rémi Gouyon
Développeur informatique
Inscription : novembre 2003
Messages : 539
Détails du profil
Informations personnelles :
Nom : Homme Rémi Gouyon
Âge : 48
Localisation : France, Loiret (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : novembre 2003
Messages : 539
Points : 531
Points : 531
Par défaut Ca marche

Merci pour vos réponses. Je viens de tester les deux requêtes et elles fonctionnent toutes les deux.
Maintenant il ne me reste plus qu'à choisir cruel dilemme
__________________
Il y a des jours où j'éprouve une haine profonde envers microsoft
Venez vous défouler ici ou c'est amusant
Mon modeste site et mes modestes oeuvres sont
Rémi
Gouyon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 14h11   #5
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
A mon avis, tu peux prendre la requête de Cinéphil. D'expérience, le WHERE...IN est plus lent qu'une jointure.

On peut étayer ceci en créant un grand jeu de données par une procédure stockée et de faire des tests de performances.
NicoD. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 19h01   #6
Membre expérimenté
 
Avatar de Gouyon
 
Homme Rémi Gouyon
Développeur informatique
Inscription : novembre 2003
Messages : 539
Détails du profil
Informations personnelles :
Nom : Homme Rémi Gouyon
Âge : 48
Localisation : France, Loiret (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : novembre 2003
Messages : 539
Points : 531
Points : 531
C'est ce que j'ai fait. Je confirme c'est effectivement plus rapide.
__________________
Il y a des jours où j'éprouve une haine profonde envers microsoft
Venez vous défouler ici ou c'est amusant
Mon modeste site et mes modestes oeuvres sont
Rémi
Gouyon 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 23h34.


 
 
 
 
Partenaires

Hébergement Web