Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta de tabela dinâmica do MySQL com colunas dinâmicas truncando o valor da chave


Existem vários problemas com seu código - diminuindo a gravidade:
  • você precisa selecionar from z_tmp_admin_system_settings , não from name
  • a coluna para agrupar chama-se category , não subdomain
  • como o princípio da consulta é usar agregação, você precisa de funções agregadas para as colunas geradas, como MAX(); versões antigas do MySQL toleram não usar uma função agregada em colunas não agregadas, mas isso não é algo para se acostumar
  • é uma boa prática cercar o nome das colunas com acentos graves, caso um dos nomes entre em conflito com uma palavra reservada (este não é o caso em seus dados de amostra, mas provavelmente não é abrangente)
  • DISTINCT provavelmente não é necessário, a menos que você tenha duplicado name s por categoria (neste caso, sinta-se à vontade para adicioná-lo de volta ao código abaixo)
  • Observação:IFNULL(..., NULL) é um não-op

Código:
SET SESSION group_concat_max_len = 100000;
SET @sql = '';

SELECT GROUP_CONCAT(
    CONCAT('MAX(IF(z_tmp_admin_system_settings.name = ''', name, ''', value, NULL)) AS `', name, '`')
)
INTO @sql
FROM z_tmp_admin_system_settings;
SET @sql = CONCAT(
    'SELECT category, ', 
    @sql, 
    ' FROM z_tmp_admin_system_settings GROUP BY category'
);

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Demonstração no DB Fiddle :
| category | 2fa | abc_processing_date | activate_new_approve_person | activate_new_schdule | additional_footer_for_person |
| -------- | --- | ------------------- | --------------------------- | -------------------- | ---------------------------- |
| acme     | 0   | today               | 1                           | 1                    |                              |