选择有子项的父母和每个父项的子项数

Select parents with childs and count of childs for each parent

提问人:Sir D 提问时间:5/27/2012 更新时间:5/27/2012 访问量:86

问:

我需要通过一个查询为每个父母选择有孩子的父母和孩子计数。 现在我使用下一个查询:

SELECT table_a.*, (SELECT COUNT(*) FROM table_b WHERE table_b.LID=table_a.LID AND table_b.Yes=0) AS Co
FROM table_a 
WHERE table_a.Ind>0 ORDER BY table_a.Ind ASC

我想我做错了......是吗?

mysql 选择

评论

0赞 Lieven Keersmaekers 5/27/2012
是什么让你改变了接受的标志?

答:

1赞 Lieven Keersmaekers 5/27/2012 #1

您的解决方案应该有效,但对每一行执行子选择 get,使其成为非最佳解决方案。更好的解决方案是同时使用两个表并使用 a 以较低的性能成本获得相同的结果。table_aJOINGROUP BY

SELECT table_a.LID
       , COUNT(*) AS Co
FROM   table_a
       LEFT OUTER JOIN table_b ON table_b.LID = table_a.LID AND table_b.Yes = 0
WHERE  table_a.Ind > 0 
GROUP BY
       table_a.LID
ORDER BY 
       table_a.Ind ASC

此外,在我看来,您应该始终为表添加别名,并使用该别名使语句更简洁、更易于阅读。

SELECT a.LID
       , COUNT(*) AS Co
FROM   table_a AS a
       LEFT OUTER JOIN table_b AS b ON b.LID = a.LID AND b.Yes = 0
WHERE  a.Ind > 0 
GROUP BY
       a.LID
ORDER BY 
       a.Ind ASC
1赞 Sagiv Ofek 5/27/2012 #2

你是对的——你做错了。即使它有效,这也是获得您喜欢的结果的错误方法。为了从一对多关系中获取总数,我们为此使用联接和分组

SELECT a.ind, count(*) Total 
FROM a JOIN b ON a.lid = b.lid
WHERE a.ind>0 AND b.yes = 0
GROUP BY a.ind
ORDER BY a.ind