Page 1 sur 1

voir les valeurs de la table 1 qui ne sont pas dans la table

Posté : 19 nov. 2008, 00:40
par erich38300
bonjour,

comment faire un select pour trouver les user de la table 2 qui ne sont pas dans la table 1

explication j'ai une table 1 avec mes user et je voudrai visualiser tous les user qui ne sont pas présents sur la table 2 ( qui a aussi une colonne user );

merci

Posté : 19 nov. 2008, 07:17
par mojorisin
Bonjour,
sans la structure des tables on ne pourra pas fournir une requête. Ceci dit le principe est simple :
il vous faut effectuer une jointure gauche entre la table2 et la table1 sur l'utilisateur et ne retenir que les entrées dont l'utilisateur de la table1 est null.

SELECT t2.* FROM table2 AS t2
LEFT JOIN table1 AS t1 ON t2.user=t1.user
WHERE
t1.user IS NULL

Posté : 19 nov. 2008, 17:16
par ercih38300
Merci c'est super !

Je sais que je vais abuser mais

pour faire un delete de toutes les données de la table1 où le user de la table1 n'est pas dans la table2 ??


merci

eric

Posté : 19 nov. 2008, 17:30
par sadeq
D'abord tu dois faire une copie des données avant de tester les requêtes de suppression.

Voici comment:

Code : Tout sélectionner

DELETE FROM table1 WHERE user NOT IN (SELECT user FROM table2)

Posté : 19 nov. 2008, 19:59
par erich38300
Super merci

réponse claire et précise

eric

Posté : 19 nov. 2008, 20:15
par zeus
Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

Posté : 19 nov. 2008, 23:22
par eich38300
Désolé je n'avais pas testé complètement

j'ai fait:

DELETE FROM table1 WHERE No_Annonce IN (SELECT distinct table1.No_Annonce FROM table1 LEFT JOIN table2 ON table1.No_Annonce=table2.No_Annonce WHERE table2.No_Annonce IS NULL )

et ça ne marche pas

le select marche nickel mais le delete plante !!

il me met

MySQL a répondu:

#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT distinct table1.No_Annonce FROM table1 LEFT JOIN table2

Posté : 20 nov. 2008, 00:06
par sadeq
Si ta version de Mysql est inférieure à 4.1, alors elle ne supporte pas les requêtes imbriquées il faudra mettre à jour Mysql au delà de la version 4.1.

Mais, il y a un problème dans ta requête :
DELETE FROM table1 WHERE No_Annonce IN (SELECT distinct table1.No_Annonce FROM table1 LEFT JOIN table2 ON table1.No_Annonce=table2.No_Annonce WHERE table2.No_Annonce IS NULL )
Car tu n'as pas besoin de faire un join si tu utilise déjà la méthode IN. Je t'explique:
Selon l'algèbre relationnelle, il y a deux méthodes pour représenter une jointure (intersection):
1. La méthode ensembliste : où l'on réalise l'intersection entre deux ensembles (SELECT) par l'opérateur IN.
Exemple:

Code : Tout sélectionner

SELECT ref, designation FROM article Where ref IN (SELECT distinct ref FROM commande WHERE id_client = 'toto')
Permet de faire une jointure ensembliste entre les articles et les commandes du client 'toto', ce qui fait que cette requête sélectionne simplement les articles qui ont été commandés par le client 'toto'.

Cette méthode produit donc une forme de Requêtes imbriquées.

2. Par contre, on peut faire la même chose en utilisant la méthode relationnelle dite "Méthode prédicatives" où l'on formule l'intersection entre deux tables non pas par des SELECT imbriqués mais par jointures des tables impliquées dans un seul et même SELECT en utilisant les liens prédéfinis entre les tables dans le modèle relationnel (clé primaire=clé étrangère ou lien entre des index identiques)
On utilise pour ça l'opérateur JOIN ... ON ... (qui est une jointure naturelle).
Et notre exemple devient :

Code : Tout sélectionner

SELECT a.ref, a.designation FROM article AS a JOIN commande AS c ON a.ref=c.ref WHERE c.id_client = 'toto')
Cette forme est la meilleure qui reste fidèle au modèle relationnelle, et n'engendre pas d'imbrication de requêtes.

Donc, tu ne dois pas mélanger les deux méthodes, surtout appliquées aux mêmes tables.

Ta requête peut alors s'écrire soit :
1. Ensembliste:

Code : Tout sélectionner

DELETE FROM table1 WHERE No_Annonce NOT IN (SELECT distinct No_Annonce FROM table2)
ou bien:
2. Prédicative:

Code : Tout sélectionner

DELETE FROM table1 LEFT JOIN table2 ON table1.No_Annonce=table2.No_Annonce WHERE table2.No_Annonce IS NULL
A+