2010-04-12 40 views
1

我將刪除所有沒有訂閱的用戶,但每次嘗試檢測用戶時似乎都會遇到問題。SQL查詢:刪除連接表中不存在的條目?

我的模式是這樣的:

用戶= {用戶ID,名}

Subscriptionoffering = {用戶ID,subscriptionname}

現在,我要做的就是要刪除用戶表中的所有用戶,在subscriptionoffering表中的計數爲零。或者換言之:所有用戶id不在subscriptionoffering表中。我嘗試過不同的查詢,但沒有結果。

我試過說where user.userid <> subscriptionoffering.userid,但這似乎並不奏效。有誰知道如何創建正確的查詢?

感謝

Mestika

回答

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

謝謝,原因:-)但我看到我忘記了一種關係。它是: 用戶{** userid **,名稱} subscriptionoffering {** subscriptionid **} usersub {** userid **,** subscriptionid **} 如何獲得此額外關係? – Mestika 2010-04-12 06:50:50

+0

對不起,自己找:-) 再次感謝 – Mestika 2010-04-12 06:52:24

+0

編輯的答案爲正確的用戶名,thx – Axarydax 2010-04-12 06:53:03

1

您可以使用多臺delete聲明以left outer join和重點不匹配行是這樣的:

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

這裏是一些測試代碼來證明它:

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)