Как я могу добавить к этому запросу дополнительное условие (используя CASE)?

Вот мой запрос:

ВЫБРАТЬ
posts.title
, SUM (CASE comments.status WHEN "одобрен" THEN 1 END) AS commentsCount
FROM сообщений
ВНУТРЕННИЕ ПРИСОЕДИНЯЙТЕСЬ к комментариям
ON comments.postID = posts.id < br> ГДЕ
posts.status =?
ГРУППА ПО
posts.title
ЗАКАЗАТЬ
commentsCount DESC
LIMIT 5

Мне нужно, чтобы он также проверял, что comment.flagged = 0, когда он получает commentsCount. Я попытался добавить дополнительные CASE в вызов SUM(), но это привело к фатальной ошибке. Как я могу этого добиться?

Спасибо!


person Steven Mercatante    schedule 08.09.2009    source источник


Ответы (3)


Похоже, что вы действительно пытаетесь сделать вот что:

SELECT
posts.title
, COUNT(*) AS commentsCount
FROM posts
INNER JOIN comments
ON comments.postID = posts.id
AND comments.status = 'approved'
AND comments.flagged = 0
WHERE
posts.status = ?
GROUP BY
posts.title
ORDER BY
commentsCount DESC
LIMIT 5

Поскольку вас интересует только comments, у которого status равно 'approved', условие должно быть в условии соединения.

Изменить: я обновил запрос, предполагая, что вы хотите подсчитать комментарии, у которых status равно 'approved', а flagged равно 0.

person Josh Davis    schedule 08.09.2009
comment
Мне нужно получить одобренные комментарии и их помеченный столбец = 0. Я попробовал ваш SQL и получил это сообщение об ошибке: «У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с «КОГДА» утверждено »WHERE posts.status =? GROUP BY posts.title ORDER ' - person Steven Mercatante; 08.09.2009
comment
Не могли бы вы объяснить, чего вы на самом деле пытаетесь достичь в своем вопросе? На простом английском. Например, я пытаюсь получить 5 сообщений с наибольшим количеством комментариев со статусом «одобрено», за исключением отмеченной части. - person Josh Davis; 08.09.2009
comment
За исключением COUNT (*), этот код работает нормально. Спасибо за помощь! - person Steven Mercatante; 08.09.2009

На основе SQL Джоша Дэвиса вот что сработало для меня:

ВЫБРАТЬ
posts.title
, posts.slug
, COUNT (comments.id) КАК commentsCount
ИЗ сообщений
ВНУТРЕННЕЕ СОЕДИНЯТЬ комментарии
ON comments.postID = posts.id
И comments.status = 'одобрен'
И comments.flagged = 0
ГДЕ
posts.status =?
ГРУППА ПО
posts.title
ЗАКАЗАТЬ
commentsCount DESC
LIMIT 5

person Steven Mercatante    schedule 08.09.2009

person    schedule
comment
Этот код дает мне такую ​​ошибку: «У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '), 1,0) AS commentsCount FROM posts INNER JOIN comments ON comments.postID = p' - person Steven Mercatante; 08.09.2009
comment
Теперь это работает, спасибо :) Мне любопытно, более или менее эффективен ваш метод, чем мой собственный ответ, который я опубликовал. - person Steven Mercatante; 08.09.2009
comment
@Arms, добавьте к каждому SELECT предисловие EXPLAIN, чтобы увидеть стратегию запроса, которую БД намеревается использовать. Тогда вы поймете, какой из них более эффективен. - person dnagirl; 08.09.2009