mysql - mysql中递归查询的更好方法

标签 mysql sql database

我有一张 table 。假设它有 2 列。 第 1 列是 Id ,第 2 列是从属 ID 如果我想知道所有依赖于 ID 的 Id。这种依赖关系可以是传递的。

即,如果 Id1 依赖于 Id2,并且 Id3 依赖于 Id1。 那么如果我想要所有依赖于 ID2 的测试结果应该是 Id2 和 Id1。

为此,我必须向 mysql 发起多个查询,直到获得 nullSet。

Select Id where dependentID='ID2';

这将给出一套。然后,我必须在上述查询输出的 ID 集上递归地触发上述查询。 我可以以某种方式仅用一个查询(即仅一个 I/O)来完成此操作吗?或者是否有比上述方法更好的方法?

我使用的数据库是MYSQL。

最佳答案

如果您以圆锥形顺序存储这些对,生活会更简单,例如

INSERT INTO tbl (id1, id2) VALUES
(LEAST($a, $b), GREATEST($a, $b));

回到您的“递归”查询。不,在 MySQL 的 SQL 中没有办法做到这一点。您必须用您最喜欢的编程语言编写循环。好吧,你可以写一个 MySQL 存储过程,但感觉真的很难。

用您的语言,我建议使用一个添加到数组的循环。保持数组有序。每次循环时,使用 IN 子句对数组元素再执行一次 SELECT。当您发现数组中没有新项目时终止循环。

SELECT 会是这样的

( SELECT id2 FROM tbl WHERE id1 IN (...) )
UNION
( SELECT id1 FROM tbl WHERE id2 IN (...) )

最好有复合索引 (id1,id2) 和 (id2, id1)。

关于mysql - mysql中递归查询的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885507/

相关文章:

php - Laravel 中的多对多关系需要表的特定名称吗?

php - 使用 SQL Result 进行第二次查询并通过 php 获取更多结果

c++ - 在C++/Qt中以文本格式序列化数据结构

java - Java异步执行MySQL查询语句的简单方法

mysql - Angular 应用程序如何通过本地服务器访问数据库?

java - 是什么导致了 Android Studio 3.1 - java.io.IOException : Failed to find byte code for javax/naming/Referenceable

mysql - INNER JOIN 和 GROUP BY 以防止重复结果

mysql - SQL 计算列中以逗号分隔的子字符串出现次数最多的次数

sql - PL/Sql过程vs函数?

php - 减少数据库 PHP MySQL 显示的图像数量