在mysql中使用select删除

在mysql中使用select删除,mysql,sql,Mysql,Sql,我有3列(id、父项、值),其中包含一些数据和此查询: SELECT * FROM test WHERE id = ( SELECT parent FROM test WHERE id=2 AND value='value' LIMIT 1 ); 上面的查询非常有效 现在,如何在一个查询中删除而不是选择该id?您不能从表中删除,然后在子选择中从同一个表中选择 DELETE FROM test WHERE id = ( select * from ( SELECT parent

我有3列(id、父项、值),其中包含一些数据和此查询:

SELECT * FROM test WHERE id = (
    SELECT parent FROM test WHERE id=2 AND value='value' LIMIT 1
);
上面的查询非常有效


现在,如何在一个查询中删除而不是选择该id?

您不能从表中删除,然后在子选择中从同一个表中选择

DELETE FROM test WHERE id = ( select * from (
    SELECT parent FROM test WHERE id=2 AND value='value' LIMIT 1 ) as t
)
但是,您可以在自联接中使用该表

DELETE t1 FROM test t1
INNER JOIN test t2 ON (t1.id = t2.parent)
WHERE t2.id = 2 and t2.value = 'value'
不能在联合删除语句中使用
limit
not
orderby

要么是加入,要么是限制/订单,由你选择


请参阅:

如果孩子先被删除怎么办?@Justin,这将只删除t1中的项目。如果需要,MySQL将使用一个临时表来保存联接结果集中的值。我不明白。你从哪里得到t1和t2的?我有一个表测试。@Alqin,他实例化了
t1
t2
,以区分他要删除的表和他要加入的表。@Johan请再看一下语法。我没有在最后使用限制1。这实际上是有效的!我的第一印象是这不管用,但确实管用。坦克@尼克,是的,我有。此外,评论中的文字是从提供的链接中直接引用的。哇,有没有徽章可以让被否决的答案被接受?所以,我不明白:缓存表是因为给了它一个别名吗?@Justin,nick在欺骗查询优化器。它不知道从同一个表中选择和删除。因为他把桌子埋在两层深的地方。查询优化器不会对此进行测试。