2012-11-27 76 views
1

我有一個存儲有向圖中,像這樣的邊緣表:MySQL的互惠搜索

Table EDGES 
    FROM_NODE | TO_NODE | STRENGTH 
    1   | 1  | 8 
    1   | 2  | 5 
    2   | 1  | 4 
    1   | 3  | 2 
    3   | 4  | 1 

而且我試圖尋找其與強度雙向支持> 3.在邊緣上例中,1 - > 2和2 - > 1都存在,但是,兩個方向上都不存在1 < - > 3。 1 - > 1不計數,原因很明顯。

主要的複雜情況是有超過1,000,000條邊進行搜索,並且在嘗試檢查它們是否奏效之前,我嘗試過的所有查詢都失敗了。

任何建議將不勝感激!

+1

MySQL不支持遞歸查詢(例如Postgres的‘事先連接’)。這是你必須做的存儲過程,或者在客戶端應用程序中進行的。 –

+0

你有沒有試過在你的查詢中調用'EXPLAIN'?你能分享關於爲你設定的指數表的信息嗎? – samuil

+0

發佈您嘗試過的一些查詢。 – Tom

回答

1

對我來說,最直接的解決辦法是這樣的:

select one.from_node, one.to_node 
from edges one 
join edges other on (one.to_node = other.from_node AND one.from_node = other.to_node) 
where one.strength > 3 AND other.strength > 3 
    AND one.from_node <> one.to_node 

如果你有大量的數據,比它的可能是重新考慮此表的索引,提高執行限制是一個好主意。

Here是一個SQL小提琴來檢查查詢。

+0

最後,我創建了一個臨時表,其中所有邊的強度均爲3,並使用Hari的連接方法查找相互結果。 – TDN169

0

我認爲你可以使用這樣的事情:

select 
    least(FROM_NODE, TO_NODE) as n1, 
    greatest(FROM_NODE, TO_NODE) as n2 
from 
    edges 
where FROM_NODE<>TO_NODE and nodes.strength>3 
group by n1, n2 
having count(*)=2