我想使用通用表表达式从sql中的树结构中删除所有子级,但似乎无法正常工作。这是我的表现在的样子,只是两个外键指向同一个表。这是reply
表
| parent_id | child_id |
|-----------|-----------|
| 1 | 60 |
| 2 | 70 |
| 70 | 80 |
帖子表看起来像这样
| 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上尝试它时,它就像一种魅力。也许将来会有其他人遇到同样的问题,或者也许到那时才能解决。
答案 0 :(得分:0)
从MariaDB切换到MySQL修复了我的问题。谢谢大家。