2016-07-21 29 views
1

假設我有如下表:獲得MySQL中通過傳遞,行

Images 

|id | similarTo| 
|---|----------| 
|1 | 2  | 
|2 | 3  | 
|--------------| 

凡性相似是foriegn鑰匙ID。我想要的是一個查詢,可以將id的傳遞閉包從兩種方式下降到2個級別。換句話說,我們得到的是:A - > B ---電>ç 也Ç - >乙 - >

所以在這種情況下,我想它返回:

Given 1: 2,3 
Given 2: 1,3 
Given 3: 1,2 

本質上,我將函數(Image A)類似於(Image B)存儲在表中。這個函數是雙向的,所以如果A與B類似,那麼B與A類似。現在我需要一個查詢,它可以找到與給定圖像相似的所有圖像,最多可達兩個級別/步驟...(也就是說,如果給定一個 - 「乙 - 」ç - > d,現在如果我想找到類似的所有圖像,它將返回B,C)

回答

1

可能的查詢象下面這樣:

SELECT 
id, 
similarTo 
From images 

UNION ALL 

SELECT 
t1.id, 
t2.similarTo 
FROM images t1 
INNER JOIN images t2 ON t1.similarTo = t2.id AND t1.id < t2.id 

DEMO

第二查詢實際的相生關係transitive。第一個獲取表中所有已定義的關係。

輸出:

你會得到輸出象下面這樣:

| id | similarTo | 
|----|-----------| 
| 1 |   2 | 
| 2 |   3 | 
| 1 |   3 | 

編輯:

對於具體的idid=2

SELECT 
id, 
similarTo 
From images 
WHERE id=2 or similarTo=2 

UNION ALL 

SELECT 
t1.id, 
t2.similarTo 
FROM images t1 
INNER JOIN images t2 ON t1.similarTo=2 AND t2.id =2 AND t1.id < t2.id 

DEMO

+0

好,我如何查詢特定的ID,說2? (所以它返回例如1,3) –

+0

請您檢查更新的答案? – 1000111

+0

不客氣。 – 1000111