在Mysql中有很多关于递归SELECT查询的问题,但大多数答案是“Mysql中的递归SELECT查询没有解决方案”。@ Symbol - 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 [email protected]
好,好,但是,如果你的表中有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 distinct col1, col2 from
那么这个查询意味着什么,你可以在这方面的工作(因为childID的得到了提高,所以我们可以订购表1):
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
。然后我们可以得到最终的预期结果。
如果是这样的话,你能想到任何特殊情况,排除我刚刚提到的解决方案吗?
这似乎是一个问题,它依赖于以正确的顺序返回的记录。例如,如果我将测试数据插入到表中,但将其插入到相反的顺序中,则SQL仅返回第一行(其中col1 = 1)。其他记录在找到父母之前已被处理并丢弃。为了解决这个问题,您需要添加一个订单子句,并且没有明显的方法来为您的数据做到这一点。下面的@GordonLinoff解决方案遭受类似的痛苦。 – Kickstart 2013-05-14 12:35:25
是的,那是第二个 – Tum 2013-05-14 13:39:42
也许,那些说递归SELECT没有解决方案的人有第二个问题。 (意思是说,毕竟没有实际的,可靠的解决方案。) – 2013-05-16 18:21:42