【发布时间】:2013-05-08 15:57:54
【问题描述】:
关于 Mysql 中的 Recursive SELECT 查询有很多问题,但大多数答案是“Mysql 中 Recursive 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
好的,但是,如果您的表在 col1 中有 2 条记录包含“1”,并且在 col1 中有 2 条包含“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 增加了,所以我们可以订购 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 中,我们只选择所有记录。然后我们可以得到最终的预期结果。
如果是这样,你能想出什么特殊情况排除我刚才提到的解决方案吗?
【问题讨论】:
-
这个问题似乎在于它依赖于以正确顺序返回的记录。例如,如果我将您的测试数据插入到表中,但以相反的顺序插入,您的 SQL 仅返回第一行(其中 col1 = 1)。其他记录在找到其父母之前已被处理和丢弃。为了解决这个问题,您需要添加一个 order 子句,并且没有明显的方法可以为您的数据执行此操作。下面@GordonLinoff 的解决方案同样受到影响。
-
是的,这是第二个问题
-
也许,那些说递归 SELECT 没有解决方案的人想到了第二个问题。 (意思是,毕竟可能没有实际的、可靠的解决方案。)
标签: mysql sql recursive-query sql-optimization