mysql-关联多行

mysql-关联多行,mysql,Mysql,我有一张桌子 SLNO| ID |CHILD ID 1 | 1 | 200 2 | 1 | 250 3 | 250 | 350 4 | 7 | 8 我们可以用一个查询来提取一行中1的所有值,即1200、250、350吗?SLNO是唯一的。首先,您确定需要这样做,将多行折叠为一行吗 最方便的快捷方式是使用分组操作和GROUP\u CONCAT功能 MySQL没有任何本机(内置)分层查询功能 您可以使用如下模式在有限的级别上模拟: SELECT

我有一张桌子

SLNO|   ID  |CHILD ID
  1 |   1   | 200
  2 |   1   | 250
  3 |   250 | 350
  4 |   7   | 8

我们可以用一个查询来提取一行中1的所有值,即1200、250、350吗?SLNO是唯一的。

首先,您确定需要这样做,将多行折叠为一行吗

最方便的快捷方式是使用分组操作和
GROUP\u CONCAT
功能

MySQL没有任何本机(内置)分层查询功能

您可以使用如下模式在有限的级别上模拟:

  SELECT GROUP_CONCAT(DISTINCT t.`CHILD_ID` ORDER BY t.`CHILD ID`) AS child_id_list 
    FROM ( 
           SELECT a1.`CHILD ID`
             FROM mytable a1
            WHERE a1.`ID` = 1

            UNION ALL 

           SELECT b2.`CHILD ID`
             FROM mytable b1
             JOIN mytable b2 ON b2.`ID` = b1.`CHILD ID`
            WHERE b1.`ID = 1

            UNION ALL

           SELECT c3.`CHILD ID`
             FROM mytable c1
             JOIN mytable c2 ON c2.`ID` = c1.`CHILD ID`
             JOIN mytable c3 ON c3.`ID` = c2.`CHILD ID` 
            WHERE c1.`ID` = 1

         ) t
这种模式可以扩展到有限数量的级别

            UNION ALL

           SELECT d4.`CHILD ID`
             FROM mytable d1
             JOIN mytable d2 ON d2.`ID` = d1.`CHILD ID`
             JOIN mytable d3 ON d3.`ID` = d2.`CHILD ID` 
             JOIN mytable d4 ON d4.`ID` = d4.`CHILD ID` 
            WHERE c1.`ID` = 1
等等

GROUP\u CONCAT
函数返回一列。返回字符串的长度限制为
group\u concat\u max\u len
变量(以及
max\u allowed\u packet
)。如果字符串的长度超过
group\u concat\u max\u len
,则返回字符串时,字符串值将自动(无错误或警告)修剪到允许的最大长度(以字节为单位)

 SELECT @@session.group_concat_max_len

要获得真正的递归,对于任何级别,都不能使用本机内置函数在单个MySQL查询中实现。您可以使用MySQL存储过程来实现所需的循环。

这能更有效吗,因为我拥有的数据集太大,有20万个ID。您能解释a1吗。
ID
=1