2016-09-15 3 views
1

Рассмотрим меня под именем таблицы «Темп»Как получить граф как 0, когда данные не найдены в таблице?

id | name 
    -----+------- 
     1 | AAA   
     2 | BBB   
     3 | BBB   

Am получая количество имен с ниже запроса

SELECT name , count(*) FROm temp where name IN ('AAA','BBB','CCC') group by 1 

Когда я выполнить запрос я получил ниже выход

 name | count 
------------+------- 
AAA  |  1 
BBB  |  2 

Но мне нужен нижний выход

name | count 
    ------+------- 
    AAA |  1 
    BBB |  2 
    CCC |  0 

Как получить этот выход ???

+2

Это действительно объявление исслед. проблема. Рассмотрите возможность обработки таких проблем на уровне презентации (если это доступно) – Strawberry

+0

Я рад, что вы это получили. Проверьте мой ответ, как принято, пожалуйста;) – daniherculano

ответ

0

Вы можете создать еще одну временную таблицу tmp2 с «ААА» ценности «BBB», «CCC» ... и тогда ваш запрос выбор будет что-то вроде этого:

SELECT tmp2.name, count(temp.name) 
FROM tmp2 
LEFT JOIN temp ON temp.name=tmp2.name 
GROUP BY tmp2.name 
+1

Спасибо за ваш ответ. С вашим ответом я внес некоторые изменения и получил результат. – Bhuvanesh

+0

Обратите внимание, что MySQL - это многопользовательская среда. Все, что вы вставляете в 'tmp2', будет использоваться всеми пользователями, если вы не определите его как временную таблицу. –

0

Если вы хотите чистый SQL одного запроса кросс-DBMS решение вам нужно что-то на этой линии (непроверенный код):

SELECT names.name, count(*) AS count 
FROM (
    SELECT 'AAA' AS name 
    UNION ALL SELECT 'BBB' 
    UNION ALL SELECT 'CCC' 
) names 
LEFT JOIN temp ON names.name=temp.name 
GROUP BY names.name 

Это включает в себя динамический SQL, так что вам нужно либо:

  • Напишите сложную процедуру для ее создания.
  • Используйте свой язык клиента (Java, PHP, что угодно ...). В этом случае вы можете просто сделать простой путь: сохранить текущий запрос и позаботиться о пустых значениях в вашем отображаемом коде.

Если вы не возражаете против нескольких запросов, другой альтернативой будет временная таблица для замены подзапроса names ad-hoc. Эта функция, как правило, не кросс-СУБД, но MySQL и PostgreSQL, кажется, имеют базовый синтаксис:

CREATE TEMPORARY TABLE names (...) 

Если даже нужно поддерживать СУБД, где временные таблицы ведут себя слишком по-разному, вы всегда можете эмулировать их с обычной таблицей и дополнительный столбец session_id, чтобы изолировать данные от разных пользователей.

0

Вам нужны левое соединение между фактическими значениями, которые вы хотите в вашем выводе (хотя это может быть SELECT DISTINCT из другой таблицы, где все значения проживают если таковой имеется), то это может быть создано с помощью SELECT и UNION и запроса. Я часто это делаю для BI, где «уровень представления» в некоторых случаях менее определен.

Смотрите пример ниже:

CREATE TABLE temp (id INTEGER, `name` CHAR(3)); 

#ALTER TABLE temp CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

INSERT INTO temp VALUES (1, 'AAA'), (2, 'BBB'), (3, 'BBB'); 

SELECT A.`name`, IFNULL(B.nameCOUNT, 0) nameCOUNT FROM 
    (
    SELECT 'AAA' `name` UNION ALL 
    SELECT 'BBB' `name` UNION ALL 
    SELECT 'CCC' `name` 
    ) A 
LEFT OUTER JOIN 
    (
    SELECT `name`, COUNT(*) nameCOUNT FROM temp GROUP BY `name` 
    ) B 
ON A.`name` = B.`name`; 

Примечание комментируемого сверка заявление, не уверен, если это будет необходимо на вашей установке, раскомментируйте, если вы видите ошибку вроде этого:

ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation '=' 

Пусть я знаю, если у вас есть какие-либо вопросы, привет,

James

+0

Я бы просто не использовал Latin-1 и UTF-8 в одном приложении. –

+0

Определенно, не было роскоши выбирать это на сервере, который я использовал для тестирования –

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