使用MySQL LEFT JOIN删除行

231

我有两个表,一个用于存储工作截止日期,另一个用于描述工作。每个工作都可以有一个状态,某些状态意味着该工作的截止日期必须从另一个表中删除。

我可以通过使用LEFT JOIN轻松地选择符合我的标准的工作/截止日期:

SELECT * FROM `deadline`
LEFT JOIN `job` ON deadline.job_id = job.job_id
WHERE `status` = 'szamlazva'
OR `status` = 'szamlazhato'
OR `status` = 'fizetve'
OR `status` = 'szallitva'
OR `status` = 'storno'

(status属于job表而不是deadline)

但是当我想从deadline表中删除这些行时,MySQL会抛出一个错误。我的查询语句是:

DELETE FROM `deadline`
LEFT JOIN `job`
ON deadline.job_id = job.job_id
WHERE `status` = 'szamlazva'
OR `status` = 'szamlazhato'
OR `status` = 'fizetve'
OR `status` = 'szallitva'
OR `status` = 'storno'

MySQL报错信息无意义:

您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法用法,例如在第1行附近使用了'LEFT JOIN job ON deadline.job_id = job.job_id WHERE status = 'szaml'的语句。

如何将我的SELECT查询转换为有效的DELETE查询?

6个回答

435

你只需要指定要应用 DELETE 的表。

仅删除 deadline 行:

DELETE `deadline` FROM `deadline` LEFT JOIN `job` ....

删除 deadlinejob 行:

DELETE `deadline`, `job` FROM `deadline` LEFT JOIN `job` ....

仅删除job行:

DELETE `job` FROM `deadline` LEFT JOIN `job` ....

7
使用 "AS",我必须在子句中使用别名以使其符合我的目的(删除孤儿):DELETE t1 FROM table1 AS t1 LEFT JOIN t2 AS t2 ON t1.uid = t2.result WHERE t2.result IS NULL - Urs
有趣的是,我的PHPMyAdmin 4.5.1语法检查器不接受在“DELETE”和“FROM”之间添加任何内容,但当我按下Go按钮时,查询仍然可以正常运行。 - clayRay
1
@clayRay PHPMyAdmin相当容易出现边缘情况问题。 - Martin

51

如果您正在使用"table as",则需要指定它来删除。

在此示例中,我删除了所有在table_2中不存在的table_1行。

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL

6
这个脚本对我很有效:
DELETE t
FROM table t
INNER JOIN join_table jt ON t.fk_column = jt.id
WHERE jt.comdition_column…;

5

试试这个:

DELETE `deadline`
FROM `deadline`
INNER JOIN `job` ON `deadline`.`job_id` = `job`.`id`
WHERE `job`.`id` = 123

4
DELETE FROM deadline where ID IN (
    SELECT d.ID FROM `deadline` d LEFT JOIN `job` ON deadline.job_id = job.job_id WHERE `status` =  'szamlazva' OR `status` = 'szamlazhato' OR `status` = 'fizetve' OR `status` = 'szallitva' OR `status` = 'storno');

我不确定这种子查询是否适用于MySQL,但可以尝试一下。假设你的deadline表中有一个ID列。


1
OP仍需要指定要“DELETE”的内容,以使查询无歧义。使用带有子查询的“In”会使所有操作变得更慢。最好避免使用。 - Ian Atkin
DELETEFROM 之间没有提到任何表。 - Istiaque Ahmed

2

MySQL允许您在DELETE语句中使用INNER JOIN子句从一个表中删除行,并删除另一个表中的匹配行。

例如,要删除符合特定条件的T1和T2表中的行,可以使用以下语句:

DELETE T1, T2 FROM T1 INNER JOIN T2 ON T1.key = T2.key WHERE condition;

其中,“key”是连接T1和T2表的键的名称,“condition”是用于指定要删除哪些行的条件。

最初的回答

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition;

请注意,在DELETE和FROM关键字之间要放置表名T1和T2。如果省略T1表,则DELETE语句仅删除T2表中的行。同样,如果省略T2表,则DELETE语句仅删除T1表中的行。
希望这能帮到您。最初的回答中已经有相应的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接