#mysql #sql #count #group-by #sum
#mysql #sql #количество #группировка по #сумма
Вопрос:
У меня есть этот запрос :
SELECT
SUM(IF(b.correct = 1,1,0)) correct_answers,
SUM(IF(b.correct != 1,1,0)) incorrect_answers,
SUM(IF(a.answer IS NULL) 1,0)) as no_answers,
a.ID
FROM `a` join b on a.answer = b.id
where a.created_at between '2014-06-10' and '2014-06-17'
group by a.ID order by correct_answers desc
По сути, я пытаюсь получить количество правильных, неправильных и нет ответов для викторины для каждого пользователя. Итак, я получаю правильные и неправильные подсчеты. Но когда я пытаюсь подсчитать количество ответов без ответов (столбец ответов равен нулю в таблице a), я получаю все нули. Что-нибудь не так с этим запросом?
Комментарии:
1. отсутствуют запятая и скобка в
SUM(IF((a.answer IS NULL) ,1,0))
2. Можете ли вы показать свою структуру базы данных. Вы объединяете таблицу a с помощью столбца answer, поэтому значения Null уже исключены join .
Ответ №1:
Попробуйте это:
SELECT SUM(b.correct = 1) correct_answers,
SUM(b.correct != 1) incorrect_answers,
SUM(a.answer IS NULL) AS no_answers,
a.ID
FROM a
LEFT JOIN b ON a.answer = b.id
WHERE a.created_at BETWEEN '2014-06-10' AND '2014-06-17'
GROUP BY a.ID
ORDER BY SUM(b.correct = 1) DESC;
Комментарии:
1. СУММА (ответ РАВЕН НУЛЮ) идеальна 🙂
Ответ №2:
Вы пропустили ‘,’ в 3-й строке
Изменить :
SUM(IF(a.answer IS NULL) 1,0)) as no_answers,
Для:
SUM(IF(a.answer IS NULL, 1,0)) as no_answers,
Ответ №3:
Исправьте это следующим образом
SUM(IF(a.answer IS NULL), 1,0)) as no_answers
вместо
SUM(IF(a.answer IS NULL) 1,0)) as no_answers
Ответ №4:
Ваш запрос выглядит правильно для того, что вы описываете. Вот возможное упрощение вместе с left join
:
SELECT SUM(b.correct = 1) correct_answers,
SUM(b.correct <> 1) incorrect_answers,
SUM(a.answer IS NULL) as no_answers,
a.ID
FROM `a` left join
b
on a.answer = b.id
where a.created_at between '2014-06-10' and '2014-06-17'
group by a.ID
order by correct_answers desc;
if
Инструкции не нужны в MySQL.
Ответ №5:
SELECT
SUM(IF(b.correct = 1,1,0)) correct_answers,
SUM(IF(b.correct != 1,1,0)) incorrect_answers,
SUM(IF(a.answer IS NULL,1,0)) as no_answers, <-- You missed a comma here. So, it was always evaluating to 0.
a.ID
FROM `a` join b on a.answer = b.id
where a.created_at between '2014-06-10' and '2014-06-17'
group by a.ID order by correct_answers desc