#mysql #sql #aggregate-functions
#mysql #sql #агрегатные функции
Вопрос:
У меня есть список строк, и я хотел бы суммировать количество строк при группировке (своего рода ПОДСЧЕТ), но только тогда, когда для каждой строки поле CustomField = 0.
Пример :
title customField
aaa 1
aaa 0
bbb 0
ccc 1
bbb 1
aaa 0
Итак, результат должен быть :
aaa 2
bbb 1
ccc 0
Как я могу это сделать с MySQL?
Редактировать
На самом деле мой реальный запрос — это :
SELECT forum_categories.title, COUNT(forum_topics.id) AS total_topics, COUNT(forum_messages.id) AS total_replies, MAX(forum_messages.date) AS last_message
FROM forum_categories
JOIN forum_topics ON forum_topics.category_id = forum_categories.id
JOIN forum_messages ON forum_messages.topic_id = forum_topics.id
GROUP BY forum_categories.id ORDER BY forum_categories.date
И я должен считать COUNT(forum_messages.id) AS total_replies
только тогда forum_messages.original=0
, вот почему я запрашиваю СУММУ 🙂
Ответ №1:
Просто отфильтруйте результирующий набор, чтобы исключить customField=1
, т.Е.
SELECT title, COUNT(*) AS numTitle
FROM yourtable
WHERE customField = 0
GROUP BY title
ORDER BY numTitle DESC
Результат:
aaa 2
bbb 1
Чтобы отобразить все заголовки, включая те, которые имеют значение 0: (также полезно, если требуются другие подсчеты)
SELECT title
, SUM(CASE WHEN customField=0 THEN 1 ELSE 0 END) AS numTitle
FROM yourtable
GROUP BY title
ORDER BY numTitle DESC
Результат:
aaa 2
bbb 1
ccc 0
Более компактный (но работает только в MYSQL):
SELECT title
, SUM(customField=0) AS numTitle
FROM yourtable
GROUP BY title
ORDER BY numTitle DESC
Комментарии:
1. Не совсем уверен, что я следую тогда. Вы могли бы использовать
CASE
вSUM
, так что, какSELECT title, SUM(CASE WHEN customField=0 THEN 1 ELSE 0 END)
… ?2. Да, кажется, работает! Спасибо @ypercube : с предложением в комментариях это тоже показывается 😉