mysql - 关联多行

时间:2016-05-09 04:04:21

标签: mysql

我有一张桌子,

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

我们可以查询,在一行中提取1的所有值,即1,200,250,350吗? SLNO是独一无二的。

1 个答案:

答案 0 :(得分:0)

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

最方便的捷径是使用GROUP BY操作和GROUP_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_CONCAT函数返回单个列。返回的字符串的长度仅限于group_concat_max_len变量(以及max_allowed_packet)。如果字符串的长度超过group_concat_max_len,则字符串值将以无提示方式(无错误或警告)修剪为返回时允许的最大长度(以字节为单位)。

 SELECT @@session.group_concat_max_len

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