2016-12-29 61 views
1

我需要一件事的帮助;SQL选择*和同一表的另一个查询结果的数量

表就像

ID, name, parent 
1, ABC, - 
2, DEF, 1 
3, GHI, 1 

我想小孩项数的每一行,我从表中获取,一个选择查询内

select *, COUNT((SELECT ID FROM ... WHERE parent = this.ID)) from ... 

这是可能的SQL内?

的结果应该是像

1, ABC, 2 
2, DEF, 0 
3, GHI, 0 
+0

您是否需要分层的结果,或将亲子关系的一个水平是否足够呢? – Mureinik

回答

0

加入表格本身。

SELECT t1.*, IFNULL(COUNT(t2.id), 0) AS childcount 
FROM yourTable AS t1 
LEFT JOIN yourTable AS t2 ON t2.parent = t1.id 
GROUP BY t1.id 

LEFT JOIN需要处理在没有孩子的情况下,所以你得到的结果0INNER JOIN会忽略这些行)。

+0

哎呀,忘了GROUP BY。固定。 – Barmar

+0

这选择了第一行 - 我需要所有行,即使没有孩子 – user1980807

+0

@ user1980807您是否在我向其添加“GROUP BY”之前或之后使用了我的答案? – Barmar

0

如果你只有一个孩子的水平,那么试试这个

select *, (SELECT count(B.ID) FROM Yourtable B WHERE A.Id = B.Parent) 
from Yourtable A 

注意:如果要包括大孩子这将无法正常工作计数

+0

这太可怕了 - O(n^2)每行的子查询。 – Hogan

1

采取为每个父计数和左原始表加入它的ID:

SELECT 
    t1.id, t1.name, IFNULL(c, 0) cnt 
FROM 
    your_table t1 
     LEFT JOIN 
    (SELECT 
     parent, COUNT(*) c 
    FROM 
     your_table 
    GROUP BY parent) t2 ON t1.id = t2.parent; 
相关问题