我想使用一个通用表表达式从sql中的树结构中删除所有子对象,但似乎无法使其正常工作。下面是我的表现在的样子,它只是两个外键引用同一个表。这是reply
表
| parent_id | child_id |
|-----------|-----------|
| 1 | 60 |
| 2 | 70 |
| 70 | 80 |
post表看起来像这样
| id | text |
|-----------|----------------------|
| 1 | "blah blah" |
| 2 | "the quick brown fox |
| 70 | "more text" |
回复表指的是帖子表id
为了使用它,我当前选择了一个根节点的子节点。例如,如果根节点是1,那么我将检索帖子60。如果根节点是2,那么我将检索70和80。我会得到80,因为它是70岁的孩子,而70是2岁的孩子。
为此,我使用以下查询:
WITH recursive cte (parent_id, child_id, text) AS
(
SELECT reply.parent_id,
child_id,
post.text
FROM reply
INNER JOIN post
ON reply.child_id = post.id
WHERE parent_id = ?
UNION ALL
SELECT p.parent_id,
p.child_id,
post.text
FROM reply p
INNER JOIN post
ON p.child_id = post.id
INNER JOIN cte
ON p.parent_id = cte.child_id )
SELECT *
FROM cte
最终,我只想递归地删除所有结果,所以我尝试了一下,但没有效果。
WITH recursive cte (parent_id, child_id, text) AS
(
SELECT reply.parent_id,
child_id,
post.text
FROM reply
INNER JOIN post
ON reply.child_id = post.id
WHERE parent_id = ?
UNION ALL
SELECT p.parent_id,
p.child_id,
post.text
FROM reply p
INNER JOIN post
ON p.child_id = post.id
INNER JOIN cte
ON p.parent_id = cte.child_id )
DELETE a
FROM reply a
INNER JOIN cte b
ON a.parent_id = b.parent_id
AND a.child_id = b.child_id
如何使用cte内部的结果删除原始答复表中的条目?我应该能够将delete语句与with
关键字一起使用,但它似乎不起作用。
EDITL别提了我正在使用MariaDB,但它不起作用。当我在MySQL上试用它的时候,它就像一个护身符。也许其他人在未来会遇到同样的问题,或者到那时它就会被解决。
发布于 2019-07-31 03:32:01
从MariaDB切换到MySQL解决了我的问题。谢谢大家。
https://stackoverflow.com/questions/57268072
复制