gpt4 book ai didi

mysql - 在mysql中通过传递性获取行

转载 作者:行者123 更新时间:2023-11-28 23:28:00 28 4
gpt4 key购买 nike

假设我有下表:

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

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

输出:

你会得到如下输出:

| 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

关于mysql - 在mysql中通过传递性获取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38513248/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com