2016-07-21 6 views
1

で推移する行は、私は次の表を持っていると仮定しなさい:mysqlの

similarToはIDにforiegnの鍵である
Images 

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

。私が望むのは、idの推移的クロージャを2つのレベルにフェッチすることができるクエリです。言い換えれば、私たちが持っていることである:A - > B ---> C ともC - > B - >

ので、この場合には、私はそれを返したい

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

私は、本質的には、関数(Image A)similarTo(Image B)をテーブルに格納しています。この関数は両方向に進むので、AがBに似ていれば、BはAと似ています。次に、与えられた画像に類似するすべての画像を最大2つのレベル/ステップで見つけることができるクエリが必要です。与えられたA - > B - > C - > D、私はAと類似のすべての画像を検索したい場合は、今、それは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

2番目のクエリは、実際にtransitive関係を生みます。最初のテーブルは、テーブル内のすべての定義された関係を取得します。

出力:

あなたは、以下のような出力が得られます:

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

EDIT:特定idについては

id=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