尝试返回父记录的所有子记录列

Pan*_*kaj 4 mysql

我正在寻找一种解决方案,通过该解决方案,我可以获得父记录的所有子记录。我找到了一个满足我需求的解决方案,如下所示

唯一的问题是上述解决方案是连接 ID。

当前结果集

它是用逗号分隔的 ID 列,值 = 2,3,4

预期产出

ID    Name    ParentID
1      1st       null
2      2nd       1
3      3rd       1
4      4th       2
Run Code Online (Sandbox Code Playgroud)

我试过下面的代码。

SELECT @pv:=
(SELECT * FROM tblreport WHERE ParentID IN (@pv)) AS lv FROM tblreport
JOIN
(SELECT @pv:=2)tmp
WHERE ParentID IN (@pv)
Run Code Online (Sandbox Code Playgroud)

并收到一条错误消息:操作数应包含 1 列

我的示例 SQL 小提琴

Luk*_*zda 5

现在,它们以逗号分隔。但是,我希望返回特定行的所有列。

您可以使用CSVids 结果,如:

SELECT *
FROM tblreport
WHERE FIND_IN_SET(ID,(SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
                     SELECT @pv:=(SELECT GROUP_CONCAT(ID SEPARATOR ',') 
                     FROM tblreport WHERE ParentID IN (@pv)) AS lv FROM tblreport
                     JOIN (SELECT @pv:=1)tmp
                       WHERE ParentID IN (@pv)) a));
Run Code Online (Sandbox Code Playgroud)

DBFiddle 演示

输出:

ID  Name    ParentID
2   2nd     1
3   3rd     1
4   4th     2
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您还需要原始行,您可以使用UNION ALL

SET @var = 1;

SELECT *
FROM tblreport
WHERE FIND_IN_SET(ID,(SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
                     SELECT @pv:=(SELECT GROUP_CONCAT(ID SEPARATOR ',') 
                     FROM tblreport WHERE ParentID IN (@pv)) AS lv FROM tblreport
                     JOIN (SELECT @pv:=@var)tmp
                       WHERE ParentID IN (@pv)) a))

UNION ALL
SELECT *
FROM tblReport
WHERE ID = @var
ORDER BY ID;
Run Code Online (Sandbox Code Playgroud)

DBFiddle Demo2