2015-11-01 2 views
1

Я хотел бы получить количество нулей по всем столбцам и таблицам для каждой базы данных на сервере MySQL. В таблице результат должен выглядеть следующим образом:Как я могу получить количество нулей на базу данных на сервере MySQL?

+---------------+------------+ 
| database_name | null_count | 
+---------------+------------+ 
| database1  |   0 | 
| database2  |  5643 | 
| database3  |   72 | 
+---------------+------------+ 

Однако, я не был в состоянии выйти за пределы подсчета нулей для одной таблицы:

SELECT concat('select', group_concat(' count(*) - count(', column_name, ') ' SEPARATOR ' + '), 'from ', MAX(table_schema), '.', MAX(TABLE_NAME)) 
INTO @SQL 
FROM information_schema.columns 
WHERE TABLE_SCHEMA = 'Accidents' 
AND TABLE_NAME = 'nesreca'; 

PREPARE stmt FROM @SQL; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

У вас есть идея?

PS: Мне удалось получить результат с кодом MATLAB. Однако решение в MySQL было бы очень предпочтительным.

ответ

0

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

select table_schema, sum(cnt) 
from (select "table_schema", count(*) as cnt from "table_name" where "column_name" is null union all 
     . . . 
    ) t 
group by table_schema; 

Вы можете построить это как:

set group_concat_max_len=1500000; 
set @subSQL = '(select "@table_schema" as table_schema, count(*) as cnt from `@table_schema`.`@table_name` where `@column_name` is null)'; 

select @subSQL := group_concat(replace(replace(replace(@subSQL, '@table_schema', table_schema 
                ), '@table_name', table_name 
              ), '@column_name', column_name 
            ) separator ' union all ' 
          ) 
from information_schema.columns; 

set @SQL = concat('select table_schema, sum(cnt) as NumNulls from (', 
        @subSQL, 
        ') t group by table_schema'); 

PREPARE stmt FROM @SQL; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Я должен отметить, что по умолчанию длина для промежуточного значения для group_concat(), вероятно, слишком мала для этого запроса. Вам придется настроить его. Системная переменная равна group_concat_max_len (см. here).

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

  • Нет связанных вопросов^_^