简体   繁体   English

获取子计数小于2的记录

[英]get records whose child count is less than 2

I am working on tree based architecure. 我正在研究基于树的架构。 There is one table called user. 有一个表叫做user。 I have providing schema of the table as follows: 我提供了表的架构,如下所示:

    CREATE TABLE `user5` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `parent_id` int(11) NOT NULL,
  `position` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `user5`
--

INSERT INTO `user5` (`id`, `name`, `parent_id`, `position`) VALUES
(1, 'test1', 0, 'NULL'),
(2, 'test2', 1, 'left'),
(3, 'test3', 1, 'right'),
(4, 'test4', 2, 'left'),
(5, 'test5', 2, 'right'),
(6, 'test6', 3, 'left'),
(7, 'test7', 3, 'right'),
(8, 'test8', 6, 'left'),
(9, 'test9', 6, 'right'),
(10, 'test10', 7, 'left');

I am passing one id as input to my foloowing query which returns all child level nodes. 我将一个id作为输入传递给我的后续查询,该查询返回所有子级节点。

SELECT
     GROUP_CONCAT(lv SEPARATOR ',') as team_members
 FROM
     (
     SELECT
         @pv:=(
             SELECT
                 GROUP_CONCAT(id SEPARATOR ',')
             FROM
                 user5
             WHERE
                 FIND_IN_SET(parent_id, @pv)
         ) AS lv
     FROM
         user5
     JOIN
         (SELECT @pv:=3)tmp
     WHERE
         parent_id IN (@pv)
                       ) a

if I am passing 3 as input to above query then will return me following result. 如果我将3作为上述查询的输入,则返回以下结果。

6,7,8,9,10

I am appending 3 as first element in above result. 我将3作为上述结果的第一个元素。

after appending : 3,6,7,8,9,10

So Now I want those ids which have less than 2 childs either 1 or 0. So my exprected result should be as follows : 所以现在我想要那些少于2个孩子的id(即1或0)。因此我得出的结果应该如下:

id  Childcount
7   1
8   0
9   0
10  0

So now I need to return only those ids which has less than 2 childs. 因此,现在我只需要返回少于2个孩子的ID。 It means it should return those id, count(count of child) which have either 0 or 1 child only. 这意味着它应该返回那些只有0个或1个孩子的id,count(孩子的数量)。 So how can we do this. 那么我们该怎么做。 Please help me in this. 请帮助我。 Thanks in advance 提前致谢

I got the answer as follows : 我得到的答案如下:

SELECT 
    a.id, 
    a.parent_id as ParentID, 
    b.TotalCout 
FROM 
    user5 a 
INNER JOIN 
    ( 
    SELECT 
        parent_id, 
        COUNT(1) as TotalCout 
    FROM 
        user5 
    WHERE 
        parent_id <> id 
    GROUP BY 
        parent_id 
    ) b 
ON 
    a.id = b.parent_id 
AND 
    b.TotalCout < 2 
AND 
    a.id IN(3,6,7,8,9,10)
UNION ALL
SELECT
    yt1.id,
    yt1.parent_id as ParentID,
    0 as TotalCout

FROM 
    user5 yt1
LEFT JOIN 
    user5 yt2
ON 
    yt1.id = yt2.parent_id
WHERE 
    yt2.id is null 
AND 
    yt1.id IN(3,6,7,8,9,10)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM