2015-11-08 61 views
-1

在MySQL服务器中删除,我有3个表被叫用户的事情,thingfile删除时,从表中基于2场条件

 
user 
uid, username, name, location, version 

thing 
thingid, username,, version 

thingfile 
thingid, code, version 

每个用户都有很多事情,每一件事情都有许多thingfiles 。

我会从用户表中删除象下面这样:

delete FROM user a WHERE a.username NOT IN (
SELECT b.by_user 
FROM bp_userlist b) 
and a.version="823" 

更新时间: 前删除: 用户:

uid username name location version 
1 abc  abc abcdd O 
2 abc  abc abcdd 823 
3 ddd  ddd dddd 823 

thing 

thingid username version 

1  abc  O 
2  abc  O 
1  abc  823 
2  abc  823 
3  ddd  823 
1  ddd   823 

thingfile 
thingid code version 
1  ee O 
2  eed O 
1  ee  823 
2  eddd 823 
3  fff 823 

后删除: 用户:

uid username name location version 
1 abc  abc abcdd O 
3 ddd  ddd dddd 823 

thing 

thingid username version 

1  abc  O 
2  abc  O 
3  ddd  823 
1  ddd   823 


thingfile 
thingid code version 
1  ee O 
2  eed O 
3  fff 823 

我想要那些属于thingi的记录东西和东西文件表中的东西也会被删除。是否有可能没有外键约束?我有超过10个表和许多连接不能在一个查询中工作。

+0

请分享您想要获得的输出以及您已经尝试过的输出。 –

+0

如果没有外键约束,则必须包含两个更多的查询才能从这两个表中删除。否则,您如何期望MySQL知道要删除哪些行,而不必以某种方式定义关系? –

+0

@RacilHilan我可以根据需要添加尽可能多的查询!没有添加外键约束 – MT467

回答

0

所以你已经有了第一个查询。另外两个表需要两个查询。不过,你需要以相反的顺序执行三个查询,像这样:

DELETE t FROM thingfile t 
INNER JOIN thing a ON a.thingid = t.thingid 
        AND a.version = t.version 
WHERE a.username NOT IN (
     SELECT b.by_user 
     FROM bp_userlist b) 
    AND a.version = '823'; 


DELETE a FROM thing a 
WHERE a.username NOT IN (
     SELECT b.by_user 
     FROM bp_userlist b) 
    AND a.version = '823'; 


DELETE a FROM user a 
WHERE a.username NOT IN (
     SELECT b.by_user 
     FROM bp_userlist b) 
    AND a.version = '823'; 

这里是一个fiddle(选择“仅文本结果”,并运行该查询,在文本中看到3个结果比更容易在网格中)。

+0

为什么你需要这么多的查询? – Strawberry

+1

@Strawberry他想从3个表中删除记录,所以他需要3个查询。你还能怎么做?发布一个答案,如果你有一个。 –

+1

对于他的问题,表结构简直不好使1查询工作。 – CurseStacker

0

@RacilHilan我不会假装,这正好对应到所需的解决方案,但我举例来说,你可以从几个表中同时删除(不使用CASCADE ON DELETE)提出它...

DROP TABLE IF EXISTS user; 

CREATE TABLE user 
(user_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,version INT NOT NULL); 

INSERT INTO user VALUES 
(1,0), 
(2,823), 
(3,823); 

DROP TABLE IF EXISTS thing; 

CREATE TABLE thing 
(thing_id INT NOT NULL 
,user_id INT NOT NULL 
,version INT NOT NULL 
); 

INSERT INTO thing VALUES 
(1,1,0), 
(2,1,0), 
(1,1,823), 
(2,1,823), 
(3,2,823), 
(1,2,823); 

DROP TABLE IF EXISTS thing_file; 

CREATE TABLE thing_file 
(thing_id INT NOT NULL 
,version INT NOT NULL 
,PRIMARY KEY (thing_id,version) 
); 

INSERT INTO thing_file VALUES 
(1,0), 
(2,0), 
(1,823), 
(2,823), 
(3,823); 

SELECT * FROM user; 
+---------+---------+ 
| user_id | version | 
+---------+---------+ 
|  1 |  0 | 
|  2 |  823 | 
|  3 |  823 | 
+---------+---------+ 

SELECT * FROM thing; 
+----------+---------+---------+ 
| thing_id | user_id | version | 
+----------+---------+---------+ 
|  1 |  1 |  0 | 
|  2 |  1 |  0 | 
|  1 |  1 |  823 | 
|  2 |  1 |  823 | 
|  3 |  2 |  823 | 
|  1 |  2 |  823 | 
+----------+---------+---------+ 

SELECT * FROM thing_file; 
+----------+---------+ 
| thing_id | version | 
+----------+---------+ 
|  1 |  0 | 
|  1 |  823 | 
|  2 |  0 | 
|  2 |  823 | 
|  3 |  823 | 
+----------+---------+ 

DELETE u,t,f 
    FROM user u 
    JOIN thing t 
    ON t.user_id = u.user_id 
    JOIN thing_file f 
    ON f.thing_id = t.thing_id 
    WHERE 823 IN (u.version,t.version,f.version); 
Query OK, 13 rows affected (0.00 sec) 

SELECT * FROM user; 
+---------+---------+ 
| user_id | version | 
+---------+---------+ 
|  3 |  823 | 
+---------+---------+ 
1 row in set (0.00 sec) 

SELECT * FROM thing; 
Empty set (0.00 sec) 

SELECT * FROM thing_file; 
Empty set (0.00 sec) 
+0

我有大约10张桌子,加入并不是这样工作的,为了简单起见,我只在这里发布了3张桌子...... – MT467

+0

@ MT467我们只能试图回答所问的问题。 – Strawberry

+0

所以现在请更新您的答案,谢谢 – MT467