MySQL中的SELECT树

时间:2014-10-31 02:56:36

标签: mysql sql

当我将此逻辑移动到我的脚本语言时,我的应用程序非常慢。我希望有一种方法可以利用MySQL本身。

考虑下表

ID' col1 ' ' col2'
-----------------
1 '   1  ' '  2  '
-----------------
2 '   2  ' '  3  '
-----------------
3 '   3  ' '  4  '
-----------------
4 '   5  ' '  4  '
-----------------

有没有办法选择col1为1的所有记录,或者col1是否是前一个匹配的行的col2?

例如,如果我说我需要与1相关的所有记录,我希望得到第1,2和3行。

这是一个查询示例,但它只是第一级深度。

SELECT col2 FROM table WHERE (col1 = 1) OR (col1 IN (SELECT col2 FROM table WHERE (col1 = 1))) 

2 个答案:

答案 0 :(得分:1)

您需要创建一个循环遍历树的存储过程,直到找不到更多子项为止。有关如何执行此操作,请参阅Recursive mysql select?

在其他DBMS中,您可以使用WITH RECURSIVE,但MySQL不支持。在这里阅读更多关于MySQL模拟的内容:
http://guilhembichot.blogspot.de/2013/11/with-recursive-and-mysql.html
基本上它和以前一样,但背后有更多的解释。

可能还有其他方法可以首先存储您的数据,以避免此类循环查询:
What is the most efficient/elegant way to parse a flat table into a tree?

答案 1 :(得分:0)

@ a23上面指出的解决方案指出了更加强大的案例处理。

这是一个在这种情况下有用的查询。

SELECT * FROM test WHERE col1=1
UNION ALL
SELECT a.* FROM test a, test b WHERE a.col2=b.col1 AND a.col1!=1;

希望它有所帮助。