Количество нулей в условии IF

#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