2010-04-12 4 views
1

Je vais supprimer tous les utilisateurs qui n'ont pas d'abonnement mais je semble rencontrer des problèmes chaque fois que j'essaie de détecter les utilisateurs.Requête SQL: Supprimer une entrée qui n'est pas présente dans une table de jointure?

Mes schémas ressemblent à ceci:

Users = {userid, nom}

Subscriptionoffering = {userid, subscriptionName}

Maintenant, ce que je vais faire est pour supprimer tous les utilisateurs dans la table des utilisateurs, il y a un nombre de zéro dans la table d'abonnement. Ou dit en d'autres termes: Tous les utilisateurs dont l'ID utilisateur n'est pas présent dans la table d'abonnement. J'ai essayé avec différentes requêtes mais sans résultat. Je ai essayé de dire where user.userid <> subscriptionoffering.userid, mais cela ne semble pas fonctionner. Est-ce que quelqu'un sait comment créer la bonne requête?

Merci

Mestika

Répondre

1
delete from Users 
where UserID not in 
    (select userid from subscriptionOffering) 
+0

Merci, de cause :-) Mais j'ai vu que j'avais oublié une relation. C'est: utilisateur {** userid **, nom} abonnementoffering {** subscriptionid **} usersub {** utilisateur **, ** abonnementid **} Comment obtenir cette relation supplémentaire? – Mestika

+0

Désolé, découvrez par moi-même :-) Merci encore – Mestika

+0

a édité la réponse pour le nom d'utilisateur correct, merci – Axarydax

1

Vous pouvez utiliser une instruction multi-table delete avec un left outer join et se concentrer sur les lignes qui ne correspondent pas comme celui-ci:

delete u from Users as u 
left outer join Subscriptionoffering as so 
on so.userid = u.userid 
where so.userid is null; 

ici est un code de test pour le prouver:

mysql> create table Users (userid int unsigned primary key auto_increment) engine = innodb; 
Query OK, 0 rows affected (0.43 sec) 

mysql> create table Subscriptionoffering (userid int unsigned not null, subscriptionname varchar(32) not null, foreign key (userid) references Users(userid)) engine = innodb; 
Query OK, 0 rows affected (0.41 sec) 

mysql> insert into Users() values(),(),(),(),(); 
Query OK, 5 rows affected (0.38 sec) 
Records: 5 Duplicates: 0 Warnings: 0 

mysql> select * from Users; 
+--------+ 
| userid | 
+--------+ 
|  1 | 
|  2 | 
|  3 | 
|  4 | 
|  5 | 
+--------+ 
5 rows in set (0.00 sec) 

mysql> insert into Subscriptionoffering (userid, subscriptionname) values (1, 'One'), (3, 'Three'), (5, 'Five'); 
Query OK, 3 rows affected (0.31 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

mysql> select * from Subscriptionoffering; 
+--------+------------------+ 
| userid | subscriptionname | 
+--------+------------------+ 
|  1 | One    | 
|  3 | Three   | 
|  5 | Five    | 
+--------+------------------+ 
3 rows in set (0.00 sec) 

mysql> delete u from Users as u 
    -> left outer join Subscriptionoffering as so 
    -> on so.userid = u.userid 
    -> where so.userid is null; 
Query OK, 2 rows affected (0.36 sec) 

mysql> select * from Users; 
+--------+ 
| userid | 
+--------+ 
|  1 | 
|  3 | 
|  5 | 
+--------+ 
3 rows in set (0.00 sec) 
Questions connexes