我有一张桌子,
SLNO| ID |CHILD ID
1 | 1 | 200
2 | 1 | 250
3 | 250 | 350
4 | 7 | 8
我们可以查询,在一行中提取1的所有值,即1,200,250,350吗? SLNO是独一无二的。
答案 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存储过程来实现所需的循环。