1

假设我有下表:

Images

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

其中similarTo 是id 的外键。我想要的是一个查询,它可以双向获取 id 的传递闭包到 2 个级别。换句话说,我们拥有的是: A --> B ---> C 以及 C --> B --> A

所以在这种情况下,我希望它返回:

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

本质上,我将函数(图像 A)similarTo(图像 B)存储在表中。这个函数是双向的,所以如果 A 与 B 相似,那么 B 与 A 相似。现在我需要一个查询,它可以通过最多两个级别/步骤找到与给定图像相似的所有图像......(也就是说,如果给定 A --> B --> C --> D,现在如果我想找到所有与 A 相似的图像,它将返回 B,C)

4

1 回答 1

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

于 2016-07-21T20:03:20.600 回答