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

标签 mysql sql recursive-query sql-optimization

关于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/

相关文章:

mysql - SQL:从最后 N(两个)条目中获取平均结果

SQL 服务器 : CROSS APPLY equivalent for ROW_NUMBER() query

sql - 如何创建没有循环关系的树表?

sql-server - SQL Server 2012 CTE 查找分层数据的根或顶层父级

mysql - Ruby mysql gem - 如何在查询时避免日期时间自动转换为字符串

mysql - 考虑到目前为止已删除的每周计数

MySQL:选择特定字符串并在多个位置进行替换

SQL 获取所有类别和所有子类别

php - 内部服务器错误.htaccess

MySQL 我如何创建这个子查询?