我正试图在下面的一组表中找出孩子的数量。环境是LAMP,但是通过其他语法帮助正确的方向。
users
-----
user_id
parent_id
user_meta
---------
user_id
registration_date
user_levels
-----------
user_id
level
这种基本结构不太可能改变,但可以延长。
select
users.user_id
from
users
inner join
user_meta
on users.user_id = user_meta.user_id
inner join
user_levels
on users.user_id = user_levels.user_id
where
parent_id = *x*
and
registration_date > *certain date*
and
level < *certain level*
*certain level*
时才会计算。如果后代的级别不低,则该节点是叶子,但应从计数中排除。*certain level*
和*certain date*
对于每个查询/查询集都相同。我已经尝试在循环中使用它,但查询量很快就会升级。这个解决方案可能会被用来存储在一个cron作业中,但我更喜欢一个实时的解决方案。
答案 0 :(得分:1)
使用当前的数据模型,没有比递归查询数据库更有效的方法。如果您能够更改数据的存储方式以包含更多信息,则可以使用Modified Preorder Tree Traversal(也称为嵌套集模型)。该模型在MySQL website的文章中讨论。本网站上也有很多例子,只搜索“修改的预订树遍历”。
答案 1 :(得分:0)
将所有用户记录拉入本地内存并在其中运行算法可能会更快,具体取决于您拥有多少用户。 SQL不适合递归树遍历。
答案 2 :(得分:0)
有一个名为“公用表表达式”的SQL99功能,它允许您创建重复功能并有效处理存储在关系数据库中的分层数据。
看起来MySql还没有(还)实现它,但你可以看到可以用这个做什么: http://msdn.microsoft.com/en-us/library/ms190766.aspx