IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

extraire des valeurs d'une table en fonction du contenu d'une sous requete


Sujet :

Requêtes MySQL

  1. #1
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 095
    Points : 1 531
    Points
    1 531
    Billets dans le blog
    5
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 67
    Points : 83
    Points
    83
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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'
    ;

  3. #3
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ça doit pouvoir se faire aussi avec une auto-jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 095
    Points : 1 531
    Points
    1 531
    Billets dans le blog
    5
    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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 67
    Points : 83
    Points
    83
    Par défaut
    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.

  6. #6
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 095
    Points : 1 531
    Points
    1 531
    Billets dans le blog
    5
    Par défaut
    C'est ce que j'ai fait. Je confirme c'est effectivement plus rapide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/07/2010, 09h51
  2. Réponses: 3
    Dernier message: 13/05/2009, 17h27
  3. [MySQL] Insérer des données dans une table, mais ce n'est pas une table USER
    Par amerex dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 16/08/2008, 01h01
  4. Réponses: 2
    Dernier message: 06/10/2007, 00h49
  5. Réponses: 6
    Dernier message: 25/09/2006, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo