Existem vários problemas com seu código - diminuindo a gravidade:
- você precisa selecionar
from z_tmp_admin_system_settings
, nãofrom name
- a coluna para agrupar chama-se
category
, nãosubdomain
- 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 duplicadoname
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 | |