从mysql查询中获取子节点数

时间:2014-02-04 05:23:19

标签: mysql sql aggregate-functions hierarchical-data

我正在使用递归表,我正在尝试构建一个查询以获取我的子节点计数但是当我通过basic_user_id限制它时,我的查询无法返回正确的计数。 设计背后的想法是让不同的用户拥有自己的公司层次结构,但是我不能让他们彼此冲突,这似乎正在发生。

enter image description here

我的查询

select * , count(c2.company_id ) 

from company_user c1 left join company_user c2 on c2.parent_id = c1.company_id  

where c1.company_id in (1337) 
and c1.basic_user_id = 23

group by c1.company_id;

basic_user_id = 23应该返回正确执行的计数

enter image description here

现在当我将basic_user_id更改为541时,我希望它返回0,但它似乎仍然会返回1的计数。

enter image description here

如何让basic_user_id = 541返回0和basic_user_id = 23以返回1?

3 个答案:

答案 0 :(得分:1)

已解决,我只需要添加第二个连接。

select * , count(c2.company_id ) 

from deepblue.company_user c1 left join deepblue.company_user c2 on c2.parent_id = c1.company_id 
and c1.basic_user_id = c2.basic_user_id 

where c1.company_id in (1337) 
and c1.basic_user_id= 541

group by c1.company_id;

答案 1 :(得分:1)

你可以尝试一下吗?你可以在这里测试一下http://www.sqlfiddle.com/#!2/73f61/2

我添加了AND child_tab.basic_user_id = parent_tab.basic_user_id ON子句。因为你正在做LEFT JOIN

SELECT parent_tab.company_id, COUNT(child_tab.company_id) 
FROM company_user parent_tab LEFT JOIN company_user child_tab
    ON child_tab.parent_id = parent_tab.company_id  
      AND child_tab.basic_user_id = parent_tab.basic_user_id
WHERE parent_tab.company_id IN (1337) 
    AND parent_tab.basic_user_id = 23
GROUP BY parent_tab.company_id;

答案 2 :(得分:0)

更改

count(c2.company_id ) 

sum(case when c2.company_id is null then 0 else 1 end) 

(请检查数据库的case语句的语法)