Answers:
众所周知,递归查询是分层查询,MySQL不支持。
但是,Oracle,Microsoft SQL Server,DB2和PostgreSQL等都支持它们。
如果您需要解决方法,则可以在此处找到动态的(因此可能有危险的)技巧:https : //stackoverflow.com/questions/8104187/mysql-hierarchical-queries
您还可以在这里找到有关如何使用分层模型(而不是邻接表)(即“ 父级”列)存储分层数据的讨论:https : //stackoverflow.com/questions/192220/what-is-the-most-efficiency-优雅的方法,将一张平桌子解析成一棵树/
祝好运!
此表设计是由Bill Karwin(在他的“ SQL Antipatterns Strike Back”演示文稿中从幻灯片48凝视)描述的一个SQL反模式“天真树” 。这种设计的问题特别是难以获得节点的所有后代(或父代)。由于您使用的是MySQL,因此无法使用其他RDBMS中存在的公用表表达式(WITH语句及其RECURSIVE修饰符)。
您剩下的是:
建立具有深度限制的自联接查询。对于深度= 5,您可以在以下行中使用:
SELECT *
FROM comments AS c1
JOIN comments AS c2 ON (c2.parent_id = c1.id)
JOIN comments AS c3 ON (c3.parent_id = c2.id)
JOIN comments AS c4 ON (c4.parent_id = c3.id)
JOIN comments AS c5 ON (c5.parent_id = c4.id)
使用支持WITH RECURSIVE的RDBMS(尽管大多数人不太可能选择这种方式)
MySQL不支持您需要的递归查询。
我前一段时间做的是编写存储过程,该存储过程提供了这样做的模型。
我将向您提供我以前的帖子链接,而不是重新发明轮子:
Oct 24, 2011
:查找分层字段的最高级别:带有CTE或不带有CTEDec 10, 2012
:MySQL:树层次查询Apr 12, 2013
:MySQL中的递归查询简而言之,我使用队列处理进行了存储过程的预排序树遍历
GetParentIDByID
GetAncestry
GetFamilyTree
parent_id
队列中开始parent_id
作为当前队列id
具有当前值的值parent_id
STEP02
id
队列中开始id
作为当前队列parent_id
取当前值id
STEP02
请查看我其他帖子中的存储过程,以查看实现。
SELECT group_concat(@id :=
(
SELECT id
FROM comments
WHERE parent_id = @id
)) AS comment
FROM (
SELECT @id := 1
) vars
STRAIGHT_JOIN
comments
WHERE @id IS NOT NULL