在 mysql 中按传递性获取行

Get rows by transitivity in mysql

假设我有以下 table:

Images

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

其中 similarTo 是 id 的外键。我想要的是一个可以通过两种方式将 id 的传递闭包提取到 2 级的查询。换句话说,我们拥有的是:A --> B ---> C 还有 C --> B --> A

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

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

本质上,我将函数(图像 A)similarTo(图像 B)存储在 table 中。这个函数是双向的,所以如果 A 类似于 B,那么 B 类似于 A。现在我需要一个查询,它可以找到与给定图像相似的所有图像最多两个 levels/steps...(即如果给定 A --> B --> C --> D,现在如果我想找到所有与 A 相似的图像,它将 return B,C)

可能是如下查询:

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 关系。第一个获取 table.

中所有已定义的关系

输出:

您将得到如下输出:

| 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