我需要一件事的帮助;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
我需要一件事的帮助;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
加入表格本身。
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
需要处理在没有孩子的情况下,所以你得到的结果0
(INNER JOIN
会忽略这些行)。
哎呀,忘了GROUP BY。固定。 – Barmar
这选择了第一行 - 我需要所有行,即使没有孩子 – user1980807
@ user1980807您是否在我向其添加“GROUP BY”之前或之后使用了我的答案? – Barmar
如果你只有一个孩子的水平,那么试试这个
select *, (SELECT count(B.ID) FROM Yourtable B WHERE A.Id = B.Parent)
from Yourtable A
注意:如果要包括大孩子这将无法正常工作计数
这太可怕了 - O(n^2)每行的子查询。 – Hogan
采取为每个父计数和左原始表加入它的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;
您是否需要分层的结果,或将亲子关系的一个水平是否足够呢? – Mureinik