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

erich38300
Invité n'ayant pas de compte PHPfrance

19 nov. 2008, 00:40

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

Eléphant du PHP | 217 Messages

19 nov. 2008, 07:17

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

ercih38300
Invité n'ayant pas de compte PHPfrance

19 nov. 2008, 17:16

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

19 nov. 2008, 17:30

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)
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

erich38300
Invité n'ayant pas de compte PHPfrance

19 nov. 2008, 19:59

Super merci

réponse claire et précise

eric

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 nov. 2008, 20:15

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 !!! ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

eich38300
Invité n'ayant pas de compte PHPfrance

19 nov. 2008, 23:22

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 nov. 2008, 00:06

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+
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène