sql查询:如何让父母没有孩子?

Posted

技术标签:

【中文标题】sql查询:如何让父母没有孩子?【英文标题】:sql query: how to make the parents without children? 【发布时间】:2011-10-20 04:11:02 【问题描述】:

我有这个查询是为了从之前的 post 中得到我想要的第一个结果,

SELECT parents.tag_id AS ParentID,
       parents.tag_name AS ParentName,
       COUNT(childs.tag_id) AS TotalChildren
FROM root_tags AS parents
    LEFT OUTER JOIN root_tags AS childs
        ON parents.tag_id = childs.parent_id
WHERE parents.parent_id IS NULL
GROUP BY parents.tag_id, parents.tag_name
ORDER BY parents.tag_id

返回,

ParentID    ParentName  TotalChildren
3           Tagname-1   2
5           tagname-2   2
6           tagname-3   1
9           tagname-4   1
18          tagname-10  0
24          tagname-13  0
26          tagname-14  0
28          tagname-15  0

但是我现在有另一个问题,因为我想归还根本没有孩子的父母,

ParentID    ParentName  TotalChildren
18          tagname-10  0
24          tagname-13  0
26          tagname-14  0
28          tagname-15  0

所以我尝试对此进行查询,

SELECT 
    parents.tag_id AS ParentID,
    parents.tag_name AS ParentName,
    COUNT(childs.tag_id) AS TotalChildren

FROM root_tags AS parents
    LEFT OUTER JOIN root_tags AS childs
    ON parents.tag_id = childs.parent_id

WHERE parents.parent_id IS NULL
AND COUNT(childs.tag_id) = '0'
GROUP BY parents.tag_id, parents.tag_name
ORDER BY parents.tag_id

但它返回错误#1111 - Invalid use of group function

我该如何解决?

【问题讨论】:

【参考方案1】:

只需在原始查询中添加 HAVING 子句:

SELECT parents.tag_id AS ParentID,
       parents.tag_name AS ParentName,
       COUNT(childs.tag_id) AS TotalChildren
FROM root_tags AS parents
    LEFT OUTER JOIN root_tags AS childs
        ON parents.tag_id = childs.parent_id
WHERE parents.parent_id IS NULL
GROUP BY parents.tag_id, parents.tag_name
HAVING COUNT(childs.tag_id) = 0
ORDER BY parents.tag_id

您的问题是您尝试将WHERE 子句与聚合和函数一起使用(COUNT)。但是您应该使用WHERE 过滤数据之前 聚合。 HAVING 用于过滤结果聚合后。

【讨论】:

【参考方案2】:

改变这部分

AND COUNT(childs.tag_id) = '0'
GROUP BY parents.tag_id, parents.tag_name

GROUP BY parents.tag_id, parents.tag_name
HAVING COUNT(childs.tag_id) = 0

【讨论】:

【参考方案3】:

使用 HAVING 代替 WHERE,并在 GROUP BY 之后

http://blog.cnizz.com/tag/mysql-error-1111/

这可能很有用。

【讨论】:

以上是关于sql查询:如何让父母没有孩子?的主要内容,如果未能解决你的问题,请参考以下文章

Sql父子查询不起作用

针对多对一关系优化 SQL 查询

一对多查询为每个父母选择所有父母和单个***孩子

查询列出所有分层的父母和兄弟姐妹及其孩子,但不列出自己的孩子

SQL:如何找到父母有给定ID的孩子的所有父母

如何将两个孩子添加到数据库中的父母