MySQL COUNT с GROUP BY и нулевыми записями - PullRequest
2 голосов
/ 12 июля 2010

У меня есть 2 таблицы:

Таблица 1. options_ethnicity со следующими записями:

ethnicity_id ethnicity_name  
1 White  
2 Hispanic  
3 African/American  

Таблица 2. inquiries со следующими записями:

inquiry_id ethnicity_id  
1 1  
2 1  
3 1  
4 2  
5 2  

Я хочу создать таблицу, которая показывает количество запросов по этнической принадлежности. Пока мой запрос выглядит так:

SELECT options_ethnicity.ethnicity_name, COUNT('inquiries.ethnicity_id') AS count
FROM (inquiries 
    LEFT JOIN options_ethnicity ON
    options_ethnicity.ethnicity_id = inquiries.ethnicity_id)  
GROUP BY options_ethnicity.ethnicity_id

Запрос дает правильный ответ, но для афроамериканца / американца столбец с нулевым результатом отсутствует.

White 3  
Hispanic 2

Если я заменю ЛЕВОЕ СОЕДИНЕНИЕ на ПРАВОЕ СОЕДИНЕНИЕ, я получу все 3 этнических названия, но подсчет для афроамериканца / американца неверен.

White 3  
Hispanic 2  
African/American 1

Буду признателен за любую помощь.

Вот обновление к этому сообщению с рабочим запросом:

SELECT 
    options_ethnicity.ethnicity_name, 
    COALESCE(COUNT(inquiries.ethnicity_id), 0) AS count 
FROM options_ethnicity LEFT JOIN inquiries ON inquiries.ethnicity_id = options_ethnicity.ethnicity_id 
GROUP BY options_ethnicity.ethnicity_id 

UNION ALL

SELECT 
    'NULL Placeholder' AS ethnicity_name, 
    COUNT(inquiries.inquiry_id) AS count 
FROM inquiries 
WHERE inquiries.ethnicity_id IS NULL 

Ответы [ 3 ]

5 голосов
/ 13 июля 2010

Поскольку вы используете LEFT JOIN, ссылки на таблицу, определенную в LEFT JOIN, могут быть нулевыми.Это означает, что вам нужно преобразовать это значение NULL в ноль (в данном случае):

   SELECT oe.ethnicity_name, 
          COALESCE(COUNT(i.ethnicity_id), 0) AS count
     FROM OPTIONS_ETHNICITY oe
LEFT JOIN INQUIRIES i ON i.ethnicity_id = oe.ethnicity_id
 GROUP BY oe.ethnicity_id

В этом примере используется COALESCE , стандартное средство ANSI для обработки значений NULL.Он вернет первое ненулевое значение, но если ничего не может быть найдено, он вернет ноль. IFNULL является допустимой альтернативой для MySQL, но она не переносима на другие базы данных, в то время как COALESCE имеет значение.


В реальной таблице базы данных есть некоторые записи взапрашивает таблицу, где ethity_id равен NULL, т.е. этническая принадлежность не была записана.Любая идея о том, как получить эти нулевые значения для подсчета, чтобы они могли быть показаны?

Я думаю, я понимаю проблему, с которой вы сталкиваетесь:

   SELECT oe.ethnicity_name, 
          COALESCE(COUNT(i.ethnicity_id), 0) AS count
     FROM (SELECT t.ethnicity_name,
                  t.ethnicity_id
             FROM OPTIONS_ETHNICITY t
           UNION ALL
           SELECT 'NULL placeholder' AS ethnicity_name,
                  NULL AS ethnicity_id) oe
LEFT JOIN INQUIRIES i ON i.ethnicity_id = oe.ethnicity_id
 GROUP BY oe.ethnicity_id

Это будетПодберите все экземпляры NULL ethncity_id, но он приписывает счет группе NULL.IE:

ethnicity_name   |  COUNT
------------------------
White            |  3  
Hispanic         |  2
NULL placeholder |  ?
3 голосов
/ 12 июля 2010

Вы посчитали строку вместо правого столбца

SELECT options_ethnicity.ethnicity_name, COUNT(inquiries.ethnicity_id) AS count
FROM inquiries 
RIGHT JOIN options_ethnicity ON options_ethnicity.ethnicity_id = inquiries.ethnicity_id  
GROUP BY options_ethnicity.ethnicity_id
1 голос
/ 13 июля 2010

Почему бы вам не "отменить" свой запрос?

SELECT 
  options_ethnicity.ethnicity_name, 
  COUNT(inquiries.ethnicity_id) AS count
FROM 
  options_ethnicity
  Left Join inquiries On options_ethnicity.ethnicity_id = inquiries.ethnicity_id
GROUP BY 
  options_ethnicity.ethnicity_id

Вам все еще может понадобится вызов Coalesce, но для меня этот запрос имеет больше смысла для того, что вы пытаетесь выполнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...