关于Mysql中的递归SELECT查询有很多问题,但大多数答案都是“Mysql中没有递归SELECT查询的解决方案”。
其实有一定的解决方案,我想清楚地知道它,所以这个问题是上一个问题的后续问题,可以在( how-to-do-the-recursive-select-query-in-mysql )找到
假设您有这张表:
col1 - col2 - col3
1 - a - 5
5 - d - 3
3 - k - 7
6 - o - 2
2 - 0 - 8
&你想找到所有连接到col1中值“1”的链接,即你想打印出来:
1 - a - 5
5 - d - 3
3 - k - 7
然后您可以使用这个简单的查询:
select col1, col2, @pv:=col3 as 'col3' from table1
join
(select @pv:=1)tmp
where col1=@pv
好的,很好,但是,如果您的表有 2 条在 col1 中包含“1”的记录和 2 条在 col1 中包含“3”的记录,例如:
col1 - col2 - col3
1 - a - 5
1 - m - 9
5 - d - 3
3 - k - 7
6 - o - 2
3 - v - 10
2 - 0 - 8
然后,当用户在 col1 中搜索“1”时,它应该显示所有连接到 2 个“1”的链接,即应该显示以下预期结果:
col1 - col2 - col3
1 - a - 5
1 - m - 9
5 - d - 3
3 - k - 7
3 - v - 10
所以,我的问题是我们如何修改上面的查询,以便它显示上面预期结果中的所有链接?
编辑:@戈登,
但如果我们省略 select different col1, col2 from
那么这个查询就有意义,你能解决这个问题吗(因为 childID 增加了,所以我们可以对 table1 进行排序):
select col1, col2,
@pv:=(case when find_in_set(col3, @pv) then @pv else concat(@pv, ',', col3)
end) as 'col3'
from (select * from table1 order by col1) tb1 join
(select @pv:='1') tmp
on find_in_set(col1, @pv) > 0
在这种情况下,我们不必担心顺序,例如,如果这是数据:
col1 - col2 - col3
4 - a - 5
1 - d - 2
1 - k - 4
2 - o - 3
6 - k - 8
8 - o - 9
输出将是:
col1 - col2 - col3
1 - d - 1,2
1 - k - 1,2,4
2 - o - 1,2,4,3
所以我们得到这个结果1,2,4,3
对吗?如果 col1 位于 1,2,4,3
中,我们只需选择所有记录。然后我们就可以得到最终的预期结果。
如果是这种情况,您能想到排除我刚才提到的解决方案的任何特殊情况吗?
最佳答案
我一直想知道这样的事情是否可行:
select distinct col1, col2
from (select col1, col2,
@pv:=(case when find_in_set(col3, @pv) then @pv else concat(@pv, ',', col3)
end) as 'col3'
from table1 join
(select @pv:='1') tmp
on find_in_set(col1, @pv) > 0
) t
这样的东西应该适用于小数据集。然而,将所有 id 放入一个字符串的想法受到字符串容量的限制。
关于mysql - @ Symbol - Mysql 中递归 SELECT 查询的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542013/