在MySQL数据库中,我有两个表之间的多对多关系。为简单起见,我们假设这些表格映射homes
及其residents
。我有第三个表来映射这些关系(home_resident_relations
)。后一个表有一个额外的列datemodified
,它通过触发器存储每行的最新更新日期。
现在我想摆脱每个家庭的所有前居民,只保留当前的居民 - 那是最新的日期。 我已经有一个工作的SELECT子句,它会列出我想要删除的所有旧关系:
SELECT * FROM `home_resident_relations` WHERE `resident_id` NOT IN
(SELECT tbl.`resident_id`
FROM `home_resident_relations` tbl
WHERE tbl.`datemodified` =
(SELECT max(tbl2.`datemodified`)
FROM `home_resident_relations` tbl2
WHERE tbl2.`home` = tbl.`home`
GROUP BY tbl2.`home`)
OR tbl.`datemodified` IS NULL
);
现在,只需用SELECT *
命令替换DELETE
即可删除所有这些行,这是一个直截了当的想法。但是,由于错误
#1093 - You can't specify target table 'home_resident_relations' for update in FROM clause
所以这是我的问题:
如何在WHERE ... NOT IN子句中使用它时从表中删除?
答案 0 :(得分:1)
尝试将DELETE与join:
一起使用DELETE FROM `home_resident_relations`
LEFT OUTER JOIN
(SELECT tbl.`resident_id`
FROM `home_resident_relations` tbl
WHERE tbl.`datemodified` =
(SELECT max(tbl2.`datemodified`)
FROM `home_resident_relations` tbl2
WHERE tbl2.`home` = tbl.`home` )
OR tbl.`datemodified` IS NULL) s
ON(s.`resident_id` = `home_resident_relations`.`resident_id`)
WHERE s.`resident_id` is null
答案 1 :(得分:1)
改为使用left join
:
DELETE hrr
FROM `home_resident_relations` hrr LEFT JOIN
(SELECT tbl.`resident_id`
FROM `home_resident_relations` tbl
WHERE tbl.`datemodified` = (SELECT max(tbl2.`datemodified`)
FROM `home_resident_relations` tbl2
WHERE tbl2.`home` = tbl.`home`
GROUP BY tbl2.`home`
) OR
tbl.`datemodified` IS NULL
) tt
ON hrd.resident_id = tt.resident_id
WHERE tt.resident_id IS NULL;
这适用于SELECT
和DELETE
。