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 23/12/2010, 09h25   #1
Invité de passage
 
Buzz The
Inscription : novembre 2010
Messages : 5
Détails du profil
Informations personnelles :
Nom : Buzz The

Informations forums :
Inscription : novembre 2010
Messages : 5
Points : 1
Points : 1
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 :
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 ?
thebuzzman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 10h14   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
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 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
En principe ta requête est pourtant plus rapide que la jointure externe avec recherche des NULL :
Code :
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 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 23/12/2010, 10h15   #3
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

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

Code sql :
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
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 11h54   #4
Invité de passage
 
Buzz The
Inscription : novembre 2010
Messages : 5
Détails du profil
Informations personnelles :
Nom : Buzz The

Informations forums :
Inscription : novembre 2010
Messages : 5
Points : 1
Points : 1
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
thebuzzman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 12h03   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
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 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
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 :
1
2
ALTER TABLE enquete_detail
ADD INDEX (enquete_id)
__________________
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 24/12/2010, 10h31   #6
Invité de passage
 
Buzz The
Inscription : novembre 2010
Messages : 5
Détails du profil
Informations personnelles :
Nom : Buzz The

Informations forums :
Inscription : novembre 2010
Messages : 5
Points : 1
Points : 1
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
thebuzzman 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 08h19.


 
 
 
 
Partenaires

Hébergement Web