#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