2017-06-21 144 views
5

我正在寻找解决方案,通过该解决方案我可以获取父记录的所有子记录。 I found a solution that meet my needs as shown here试图返回父记录的所有子记录列

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

当前ResultSet

据逗号与值ID柱分离= 2,3,4

期望输出

ID Name ParentID 
1  1st  null 
2  2nd  1 
3  3rd  1 
4  4th  2 

我尝试下面的代码。

SELECT @pv:= 
(SELECT * FROM tblreport WHERE ParentID IN (@pv)) AS lv FROM tblreport 
JOIN 
(SELECT @pv:=2)tmp 
WHERE ParentID IN (@pv) 

和得到的错误消息:操作数应包含1列(多个)

My sample SQL Fiddle

+0

您使用的是哪个mysql版本? – Psi

+0

Pankaj,首先我会说编辑问题来改变它,所以现在完全不同的问题不是一个好主意。你总是可以问一个新的问题。至于你目前的问题,不清楚应该如何返回所有子记录的数据? RDBMS是面向行的,并且您实际上想要将几行合并为一行。你能指定那个“超级行”应该是什么样子吗? – SergGr

+0

现在,他们将逗号分开。但是,我期待返回特定行的所有列。请检查此答案为当前状态:https://stackoverflow.com/questions/28363893/mysql-select-recursive-get-all-child-with-multiple-level/28366310#28366310,我期待返回所有列一排而不仅仅是逗号分隔。 – Pankaj

回答

5

现在,他们来逗号分隔。但是,我期待返回特定行的所有列。

你可以使用CSV IDS导致这样的:

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)); 

DBFiddle Demo

输出:

ID Name ParentID 
2 2nd  1 
3 3rd  1 
4 4th  2 

编辑:

如果您还需要原始行,你可以使用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:[email protected])tmp 
         WHERE ParentID IN (@pv)) a)) 

UNION ALL 
SELECT * 
FROM tblReport 
WHERE ID = @var 
ORDER BY ID; 

DBFiddle Demo2

+0

您是否也可以包含正在用来搜索儿童记录的ID?正如你在预期的结果集中看到的那样? – Pankaj

+0

@Pankaj请不要编辑问题,因为现在你使我的答案无效。如果你想扩展你的问题,请添加**'EDIT' **部分并发布新的需求。 – lad2025

-1

这种输出简单地通过这个简短的查询提供:

SELECT * from tblreport WHERE FIND_IN_SET(id, '2,3,4'); 

更重要的是...

使用MySQL 8.0或MariaDB 1 0.2 - 每个都有递归的CTE查询,可方便地查看分层数据库树。

(不要使用CSV,只能使用不同的行。)

+0

我将如何获得逗号分隔值? – Pankaj

+0

我不知道。 _你提到“2,3,4”;那个是从哪里来的? –