2013-08-12 4 views
0

У меня есть запрос, который выглядит следующим образом:MySQL COUNT() возвращает 0

SELECT 
    app.application_id, 
    j.job_number, 
    j.job_id, 
    j.job_title, 
    j.job_city, 
    j.job_state, 
    p.person_id AS candidate_id, 
    p.first_name, 
    p.last_name, 
    app.start_date, 
    ope1.percent_complete, 
    MAX(CASE 
     WHEN r.role_display_name = 'ENG - Recruiter' THEN 
     (SELECT CASE WHEN COUNT(last_name) = 0 THEN 
        'Unassigned' 
       ELSE 
        COUNT(last_name) 
       END AS uname 
      FROM users 
      JOIN job_roles ON job_roles.user_id = users.user_id 
      WHERE job_id = j.job_id 
      AND role_id = r.role_id 
     ) 
     ELSE '' END) AS role_3 

Моя проблема заключается в том, что COUNT(last_name) не вернет 0, потому что никакие записи не возвращаются, поэтому нет значение NULL , Все имеет смысл, однако я попробовал обернуть его в IFNULL(), ISNULL(), и ни один из них, похоже, не исправил эту проблему. Как я могу заставить его возвращать 0, когда нет записей? Нужно ли мне еще подзапрос внутри COUNT() агрегат? Я бы очень хотел, чтобы не использовать другой подзапрос ....

+1

Это не будет работать. Вы пытаетесь использовать результат сводной функции в контексте строки в своем подзапросе. результаты COUNT() будут недоступны до тех пор, пока ПОСЛЕ всей таблицы не будут отсканированы. –

+0

Если вы используете php для обработки содержимого, вы можете как-то обмануть и использовать 'if (! $ lname_count) $ lname_count = 0;' –

+0

@MarcB Как проверить, что запись существует для этого условия? –

ответ

1

Если правильно понимаю, что вы хотите, вы можете попытаться переписать его таким образом

SELECT ... 
     ,MAX(CASE WHEN r.role_display_name = 'ENG - Recruiter' 
       THEN COALESCE(NULLIF(
       (
        SELECT COUNT(last_name) 
         FROM users JOIN job_roles 
         ON job_roles.user_id = users.user_id 
         WHERE job_id = j.job_id 
         AND role_id = r.role_id 
       ), 0), 'Unassigned') 
       ELSE '' 
      END) as role_3 
     ... 
+0

В этом случае 'COUNT (last_name)' может возвращать только 0, когда есть совпадения * и * во всех них столбец 'last_name' не имеет значений (содержит NULL). Я думаю, что более вероятно, что OP просто нужно использовать левое соединение вместо внутреннего. Помимо этого, использование NULLIF() здесь очень аккуратно. –

Смежные вопросы