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 :

Requête sur 2 tables et afficher manquant


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Requête sur 2 tables et afficher manquant
    Chers toutes et tous,

    Je recherche le moyen de trouver les données non enregistrées dans une table par rapport à une autre.

    J'ai 2 tables, une enquete_info et enquete_detail.

    enquete_info comporte le champ incrémental enquete_id

    enquete_detail comporte le champ enquete_id, ce champ est rempli par des actions PHP avec les même données du champ enquete_id de la table enquete_info.

    Mais, la table enquete_detail ( contenant 2135 entrées ) ne contient pas le même nombre d'entrée que la table enquete_info ( contenant 2190 entrées, de 1 à 2190 ). Ceci est normal, je tiens à le préciser.

    Maintenant, je souhaite afficher UNIQUEMENT les 55 entrées manquantes de la table enquete_detail par rapport à la table enquete_info.

    Comment puis-je réaliser cet exercice ? Merci de votre aide

    J'ai trouvé un moyen :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT enquete_id 
    FROM enquete_info 
    WHERE NOT EXISTS ( 
      SELECT enquete_id 
      FROM enquete_detail 
      WHERE enquete_detail.enquete_id = enquete_info.enquete_id )
    Mais ceci est très lent à l'affichage. Existe-il un moyen d'accélérer le processus ?

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    En principe ta requête est pourtant plus rapide que la jointure externe avec recherche des NULL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT i.enquete_id
    FROM enquete_infos i
    LEFT OUTER JOIN enquete_detail d ON d.enquete_id = i.enquete_id
    WHERE d.enquete_id IS NULL
    Dans les deux cas, il faut bien sûr que les colonnes enquete_id de chaque table soit indexées, ce qui est probablement le cas pour la colonne (et pas champ !) auto-incrémentée dans la table enquete_info mais est-ce le cas dans la table enquete_detail ?

    Avec ton très faible nombre de lignes, la requête devrait donner sa réponse instantanément.

    Peut-être est-ce ton DISTINCT qui ralentit le processus ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour,

    tu peux faire un LEFT JOIN et récupérer uniquement les valeurs NULLES

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM enquete_info
    LEFT JOIN enquete_detail 
    ON enquete_detail.enquete_id = enquete_info.enquete_id
    WHERE enquete_detail.enquete_id IS NULL

    PS: mais je pense pas que ce sera plus rapide

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci à vous deux pour vos réponses.

    @CinePhil
    En effet, je n'ai pas d'index pour la table enquete_detail. Maintenant, si je souhaite effectuer ceci ( ajouter un index ), dois-je lier à l'autre table ?

    J'ai souci de tout "bousiller" en créant cet index, car je n'ai jamais exécuté ce type d'insertion. Cette clé devrait être primaire ou unique puisque qu'il n'y a pas d'auto-incrément ( injection directe - autoalimentation - par un code PHP ) ?

    Merci encore

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il ne s'agit pas d'ajouter une colonne mais d'indexer la colonne enquete_id de la table enquete_detail !

    Si tu utilises phpMyAdmin, dans l'onglet "Structure" de la table, tu affiches "+ Détails" et tu vois les index existants. S'il n'y en a pas sur la colonne (improprement appelée "champ" par phpMyAdmin !) enquete_id, tu cliques sur "Exécuter" de la ligne "Créer un index" puis tu choisis la colonne à indexer. Si cette colonne doit aussi être clé primaire de la table, tu choisis le type d'index PRIMARY, si ce n'est pas la clé primaire mais que chaque valeur de enquete_id doit être unique dans la table, tu choisis le type d'index UNIQUE, sinon tu choisis simplement INDEX.

    Autre méthode avec une requête SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE enquete_detail
    ADD INDEX (enquete_id)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci CinePhil

    Votre message est très clair. J'ai exécuté votre procédure et tout baigne.

    Je vous souhaite mes bons vœux

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

Discussions similaires

  1. Besoin d'aide pour requête sur grosse table
    Par Fabouney dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/01/2006, 09h01
  2. Problème de requêtes sur deux tables
    Par Pymm dans le forum Access
    Réponses: 6
    Dernier message: 06/09/2005, 09h06
  3. Requête sur plusieurs tables
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/07/2005, 12h25
  4. Requête sur 2 tables ?
    Par kibodio dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/03/2005, 15h57
  5. Requête sur 2 tables et surtout novice...
    Par kibodio dans le forum Langage SQL
    Réponses: 13
    Dernier message: 03/03/2005, 15h45

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