如何在MySQL中检索节点的子节点和子节点?

时间:2014-01-05 13:35:33

标签: mysql stored-procedures

我有一个带有以下2个表的MySQL数据库:

节点id(这仅用于示例,实际上还有更多字段)。

边缘sourcetarget是2个节点的ID,weight表示连接强度。

我想通过连接强度获得他的20个顶级孩子的某个节点,并为他的每个孩子分别获得前20个孩子(意味着总共最多400个节点行)。

我已经调查了这个问题,我理解最成为可能的方式可能是递归过程(因为函数不能在MySQL中递归调用)但看到MySQL不支持表变量我不得不寻找其他的东西临时表。

毕竟我仍然迷失在地球上我会去做这件事,我会感激任何帮助。

2 个答案:

答案 0 :(得分:0)

好的,试试吧。

首先,只是第一级

select e.target, e.weight
from Edge e
where e.source=:id
order by e.weight limit 20;

尝试在select中编写子查询,因为如果我进行连接,我无法正确限制20 每个 e.target :(

select e.target, e.weight, (select group_concat( f.target separator ',')
    from edge f
    where f.source = e.target
    order by f.weight limit 20;
)
from edge e
where e.source=2
order by e.weight limit 20;

答案 1 :(得分:0)

您需要为此编写2个查询..

First Query将是..

CREATE TEMPORARY TABLE temp_table AS 
SELECT 
eChild.* 
FROM 
Edge eParent
INNER JOIN
Edge eChild
ON ( eParent.target = eChild.source )
WHERE eParent.source = <X>
ORDER BY eParent.weight DESC
LIMIT 20

现在,需要对temp_table中的每个结果执行第二次查询..

SELECT 
eChild.* 
FROM 
temp_table eParent
INNER JOIN
temp_table eChild
ON ( eParent.target = eChild.source )
WHERE eParent.source = <Y>
ORDER BY eParent.weight DESC
LIMIT 20

您也可以尝试使用存储过程实现相同的逻辑;