获取子计数小于2的记录

von4xj4u  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(381)

我正在研究基于树的架构。有一个名为user的表。我提供了如下表的模式:

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

我将一个id作为输入传递给我的following查询,该查询返回所有子级节点。

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

如果我将3作为输入传递给上述查询,那么将返回以下结果。

6,7,8,9,10

我在上面的结果中附加3作为第一个元素。

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

所以现在我想要那些少于2个孩子的ID要么1要么0。所以我的解释结果应该是:

id  Childcount
7   1
8   0
9   0
10  0

所以现在我只需要返回那些少于2个孩子的id。这意味着它应该返回那些id,count(count of child),它们只有0或1个子级。那我们怎么做呢。请帮帮我。提前谢谢

rslzwgfq

rslzwgfq1#

我得到的答案如下:

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)

相关问题