2016-07-21 27 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