使用MySQL LEFT JOIN删除行


185

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

我可以轻松地SELECT通过以下方式满足我的条件的工作/最后期限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属于jobdeadline

但是,当我想从中删除这些行时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 jobON最后期限附近使用。job_id= job.job_id WHERE status='szaml'

如何将我SELECTDELETE查询变成有效的查询?

Answers:


334

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

4
对于“ AS”,我必须在子句中使用别名以使其达到我的目的(删除孤儿):从表1中删除t1 AS t1左联接t2 AS t2上t1.uid = t2.result其中t2.result为NULL
Urs

有趣的是,我的PHPMyAdmin 4.5.1语法检查器在DELETE和之间不接受任何内容FROM,但是当我按Go时查询仍然可以正常运行。
clayRay

38

如果您使用“表为”,则将其指定为删除。

在示例中,我删除了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

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中使用,但请尝试一下。我假设您在截止日期表中有一个ID列。


1
OP仍然需要指定DELETE要使查询明确的内容。In与子查询一起使用会使一切变慢。最好避免。
伊恩·阿特金

DELETE和之间没有提及表格FROM
Istiaque Ahmed

1

试试这个:

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

1

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表中的行。

希望能有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.