Запрос для получения количества элементов в каждой категории (чтобы показать даже пустые элементы с 0 элементами)

#php #mysql #sql #select #count

#php #mysql #sql #выберите #количество

Вопрос:

Я только что написал этот запрос для своих таблиц: НОВОСТИ и НОВОСТИ-КАТЕГОРИИ, чтобы подсчитать элементы каждой категории:

 SELECT DISTINCT CAT.cid, CAT.c_title, N.n_category, count(*) AS cat_count
  FROM news N
 inner join news - categories CAT
    on CAT.cid = N.n_category
 GROUP BY N.n_category
  

но проблема в том, что он просто показывает мне категории, которые содержат новости! но я хочу получить все категории, даже те, у которых пустые новости…

моя таблица НОВОСТЕЙ:

 nid | n_category | etc
  

моя таблица КАТЕГОРИЙ НОВОСТЕЙ:

 cid | c_title | etc
  

Спасибо за вашу помощь

С уважением

Ответ №1:

Попробуйте это:

 SELECT
    CAT.cid,
    CAT.c_title,
    count(N.n_category) AS cat_count
FROM `news-categories` CAT 
    LEFT JOIN `news` N  
        ON CAT.cid = N.n_category  
GROUP BY CAT.cid,
    CAT.c_title
  

Комментарии:

1. В coalesce() этом нет необходимости.

2. @GordonLinoff, в чем разница?

3. Чтобы удалить coalesce() , вам нужно подсчитать идентификаторы из второй таблицы. * Будет возвращен 1 , если совпадения нет.

4. Спасибо, чувак! это работает нормально, ответ @Barmar’s также был work

Ответ №2:

Используйте LEFT JOIN :

 SELECT CAT.cid, CAT.c_title, IFNULL(COUNT(N.n_category), 0) AS cat_count
FROM `news-categories` AS CAT
LEFT JOIN news AS N ON CAT.cid = N.n_category
GROUP BY CAT.cid
  

Что следует отметить: 1) Вы должны использовать столбец из news в COUNT() выражении, а не COUNT(*) , чтобы совпадение с нулем не учитывалось. 2) Нет необходимости выбирать N.n_category , поскольку это всегда равно CAT.cid , и вы уже выбираете это. 3) ГРУППА ПО столбцу должна быть из news-categories таблицы — вы не можете группировать по столбцу в таблице, в котором может не быть совпадающих строк, поскольку это значение всегда будет NULL .

Ответ №3:

Я просто хочу отметить, что вы также можете сделать это с помощью подзапроса:

 SELECT CAT.cid, CAT.c_title,
       (SELECT COUNT(*) FROM news N WHERE CAT.cid = N.n_category)
FROM `news - categories` CAT;
  

При некоторых обстоятельствах это может даже повысить производительность.

Комментарии:

1. это хорошо работает, чувак, но я думаю, что предложенный @Barmar работал с bttr LEFT JOIN