在 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
第二个查询实际上产生了 transitive
关系。第一个获取 table.
中所有已定义的关系
输出:
您将得到如下输出:
| id | similarTo |
|----|-----------|
| 1 | 2 |
| 2 | 3 |
| 1 | 3 |
编辑:
具体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
假设我有以下 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
第二个查询实际上产生了 transitive
关系。第一个获取 table.
输出:
您将得到如下输出:
| id | similarTo |
|----|-----------|
| 1 | 2 |
| 2 | 3 |
| 1 | 3 |
编辑:
具体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