Search code examples
phpmysqlsqlmysql-error-1111

sql query: how to make the parents without children?


I have this query to get the first result I want from this post earlier,

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

Which returns,

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

But I have another problem now as I want to return the parents that have not children at all,

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

So I tried to make query into this,

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

But it returns an error #1111 - Invalid use of group function

How can I fix it?


Solution

  • Just add a HAVING clause to you original query:

    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
    

    Your problem is that you tried to use WHERE clause with aggregation and function (COUNT). But you should use WHERE to filter the data before aggregation. HAVING is for filtering results after aggregation.