SQL-запрос: как сделать родителей без детей? - PullRequest
2 голосов
/ 04 августа 2011

У меня есть этот запрос, чтобы получить первый желаемый результат из этой публикации ранее,

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

Как я могу это исправить?

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

Просто добавьте предложение 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 для фильтрации результатов после агрегирования .

1 голос
/ 04 августа 2011

Изменить эту часть

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
0 голосов
/ 04 августа 2011

Используйте HAVING вместо WHERE и после GROUP BY

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

Это может быть полезно.

...