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 :

Tester l'existence avec une jointure


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut Tester l'existence avec une jointure
    Bonjour

    J'aimerais faire un test d'existence via une jointure. Cependant je ne souhaite pas avoir plusieurs ligne retournées comme le fait la jointure. Un exemple pour que ce soit plus parlant :-)

    J'ai fait 2 tables. Maison et Habitant. Habitant est relié à Maison par une clef étrangère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE `maison` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM ;
     
    CREATE TABLE `habitant` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `maison_id` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `maison_id` (`maison_id`)
    ) ENGINE=MyISAM;
    J'aimerais sélectionné toutes les maisons qui ont des habitants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT maison.* FROM maison INNER JOIN habitant ON habitant.maison_id = maison.id
    Ceci est un exemple simplifié. Dans mon cas j'ai plusieurs millions d'enregistrements. Une requête mal conçu poserait de gros problèmes.

    Une idée ? :-)

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 062
    Par défaut
    Bonjour,

    Le mot-clef DISTINCT est fait pour ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT maison.id, maison.name 
    FROM maison 
    INNER JOIN habitant ON habitant.maison_id = maison.id
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut
    Bonjour ced

    J'ai oublié de préciser, je ne souhaite pas utiliser de DISTINCT ou GROUP BY sur l'ID car alors MySQL a recours a des tables temporaires altérant les performances.

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 062
    Par défaut
    Alors, via une jointure, ce n'est pas possible...
    Il faut éventuellement passer par la clause EXISTS (ce qui est même plus rapide que la jointure, en théorie) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT m.id, m.name 
    FROM maison m
    WHERE EXISTS (
        SELECT *
        FROM habitant h
        WHERE h.id_maison = m.id
    )
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut
    Merci ced, ca a l'air de plutot bien fonctionné :-)

    Par curiosité, est ce que si ma table maison contient 1 millions d'entrées, MySQL va t'il devoir faire 1 millions d'opérations EXISTS ?

Discussions similaires

  1. [RegExp] Tester l'existence d'une chaine avec les regexp
    Par mustapha_aim dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/07/2010, 10h48
  2. Tester l'existence d'une table avec une requête
    Par Oluha dans le forum Access
    Réponses: 6
    Dernier message: 29/08/2005, 09h45
  3. tester l existance d une table
    Par mick84m dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/04/2005, 11h24
  4. [JDBC]Tester l'existence d une table
    Par juflata dans le forum JDBC
    Réponses: 7
    Dernier message: 29/06/2004, 15h27
  5. [ADO] Tester l'existence d'une table
    Par nd25 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/09/2002, 13h55

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