我有一个带有以下2个表的MySQL数据库:
节点:id
(这仅用于示例,实际上还有更多字段)。
边缘:source
。 target
是2个节点的ID,weight
表示连接强度。
我想通过连接强度获得他的20个顶级孩子的某个节点,并为他的每个孩子分别获得前20个孩子(意味着总共最多400个节点行)。
我已经调查了这个问题,我理解最成为可能的方式可能是递归过程(因为函数不能在MySQL中递归调用)但看到MySQL不支持表变量我不得不寻找其他的东西临时表。
毕竟我仍然迷失在地球上我会去做这件事,我会感激任何帮助。
答案 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
您也可以尝试使用存储过程实现相同的逻辑;