使用 MySQL LEFT JOIN 删除行

Posted

技术标签:

【中文标题】使用 MySQL LEFT JOIN 删除行【英文标题】:Deleting rows with MySQL LEFT JOIN 【发布时间】:2011-02-15 07:59:18 【问题描述】:

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

我可以通过LEFT JOIN 轻松SELECT 满足我的标准的工作/截止日期:

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 查询?

【问题讨论】:

【参考方案1】:

这个脚本对我有用:

DELETE t
FROM table t
INNER JOIN join_table jt ON t.fk_column = jt.id
WHERE jt.comdition_column…;

【讨论】:

【参考方案2】:

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

例如,要从 T1 和 T2 表中删除满足指定条件的行,请使用以下语句:

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

请注意,您将表名 T1 和 T2 放在 DELETE 和 FROM 关键字之间。如果省略 T1 表,则 DELETE 语句只删除 T2 表中的行。同样,如果省略 T2 表,DELETE 语句将只删除 T1 表中的行。

希望对您有所帮助。

【讨论】:

【参考方案3】:

试试这个:

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

【讨论】:

【参考方案4】:

如果你使用的是“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

【讨论】:

【参考方案5】:

您只需指定在哪些表上应用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` ....

【讨论】:

对于“AS”,我必须在我的子句中使用别名才能使其达到我的目的(删除孤儿):DELETE t1 FROM table1 AS t1 LEFT JOIN t2 AS t2 ON t1.uid = t2 .result WHERE t2.result 为空 有趣的是,我的 phpMyAdmin 4.5.1 语法检查器不接受介于 DELETEFROM 之间的任何内容,但是当我按下 Go 时,查询运行正常。【参考方案6】:
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,但请尝试一下。我假设您的截止日期表中有一个 ID 列。

【讨论】:

OP 仍然需要指定 DELETE 的内容以使查询明确。将In 与子查询一起使用会使一切变慢。最好避免。 DELETEFROM 之间没有提到表。

以上是关于使用 MySQL LEFT JOIN 删除行的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 和 PHP 中使用多表和 LEFT JOIN 查询非常慢

关于mysql中的left join和left outer join的区别

使用 LEFT OUTER JOIN 检查相关行不存在的最佳方法是啥

MySQL Left join 无法在单个查询中删除重复项

为啥 MySQL LEFT JOIN 不返回所有行,除非有 WHERE 子句 - phpMyAdmin 问题

MySQL LEFT JOIN 多个条件