2014-01-05 238 views
0

我有一個MySQL數據庫與2個表:如何在MySQL中檢索節點的子節點和大孩子?

節點id(這只是例子,在現實中有更多的領域)。

Edgesourcetarget,它們是2個節點的ID,weight代表連​​接強度。

我想通過連接強度和他的孩子的每個孩子他們各自的前20名子女(意味着總共最多400個節點行)爲特定節點ID獲得他的20個頂級子女。

我已經研究過這個問題,我知道最成熟的方式可能是遞歸過程(因爲函數不能在MySQL中遞歸調用),但看到MySQL不支持表變量,我不得不尋找其他的東西臨時表。

畢竟,我仍然失去了如何在地球上我去這個,將不勝感激任何形式的幫助。

+0

難道你確切:它是一個oneshot還是你想經常做? ...?我的問題的目標是決定是否嘗試提供一個簡單的解決方案或者是否真的需要優化。 – farvilain

+0

如果你只是(總是)深入兩層,你可能會自我加入兩次。否則,你可能想看看像neo4j這樣的東西。 – ethrbunny

+0

@farvilain,這是一些網站的應用程序的一部分,所以頻率取決於很多事情。基本上用戶輸入一個id,然後查詢必須運行。 ethrbunny,我試過它與自我加入,它可以正常工作,當前20選擇不需要,但我不知道如何解決問題時,如上所述。另外,如果可能,我想留在MySQL中。 – user3162466

回答

0

好吧,讓我們試試。

首先,僅僅是第一級

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

試圖寫在選定的子查詢,因爲如果我做一個連接,我不能夠在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; 
0

你需要寫2個查詢該..

第一個查詢將是..

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 

您可以嘗試使用存儲過程也實行同樣的邏輯;