一尘不染

@ Symbol-MySQL中递归SELECT查询的解决方案?

mysql

关于Mysql中的递归SELECT查询有很多问题,但是大多数答案是“ Mysql中没有递归SELECT查询的解决方案”。

其实有一定的解决方案,我想清楚地知道,所以这个问题是可以在(how-to-do-the-cursive-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

所以,我的问题是 我们如何修改上面的查询,以便它能像上面的预期结果一样显示所有链接?

编辑: @ Gordon,但是如果我们省略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。然后,我们可以获得最终的预期结果。

如果是这样,您能想到任何排除我刚才提到的解决方案的特殊情况吗?


阅读 268

收藏
2020-05-17

共1个答案

一尘不染

我一直在想这样的事情是否行得通:

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放入字符串的想法仅限于字符串的容量。

2020-05-17