Jos*_*osh 16 mysql join foreign-key select
我有一张comments
表,可以简化为:
comments
=======
id
user_id
text
parent_id
Run Code Online (Sandbox Code Playgroud)
where 可以parent_id
为空,但可能是其父注释的键。
现在,我如何才能select
对特定评论的所有后代?
评论可能低了好几层……
Val*_*oer 17
或者,您可以在此处找到动态(因此具有潜在危险)的技巧:https : //stackoverflow.com/questions/8104187/mysql-hierarchical-queries
您还可以在此处找到有关如何使用其他模型而不是使用邻接列表(即父列)存储分层数据的讨论:https : //stackoverflow.com/questions/192220/what-is-the-most-efficient-优雅的方式来解析一个平面表到一棵树/
祝你好运!
这个表设计是 Bill Karwin 所描述的 SQL 反模式“朴素树”(从他的SQL 反模式反击演示中的幻灯片 48 开始)。这种设计的具体问题是难以获取节点的所有后代(或父节点)。由于您使用的是 MySQL,因此您不能使用其他 RDBMS 中存在的公共表表达式(WITH 语句及其 RECURSIVE 修饰符)。
你剩下的是:
构建具有深度限制的自连接查询。对于depth = 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)
Run Code Online (Sandbox Code Playgroud)使用支持 WITH RECURSIVE 的 RDBMS(尽管这很可能不是大多数人的选择)
MySQL 不支持递归查询,例如您需要的查询。
不久前我所做的是编写存储过程来提供这样做的模型。
我不会重新发明轮子,而是为您提供我过去关于此帖子的链接:
Oct 24, 2011
:查找分层字段的最高级别:有与没有 CTEDec 10, 2012
:MySQL:树层次查询Apr 12, 2013
: mysql 中的递归查询简而言之,我制作的存储过程使用队列处理进行预序树遍历
GetParentIDByID
GetAncestry
GetFamilyTree
parent_id
队列中的 a开始parent_id
作为当前id
具有当前值的值加入队列parent_id
STEP02
id
队列开始id
作为当前parent_id
将当前值入队id
STEP02
请查看我其他帖子中的存储过程以查看实现。
归档时间: |
|
查看次数: |
55556 次 |
最近记录: |