Hay varios problemas con su código, al disminuir la gravedad:
- debe seleccionar
from z_tmp_admin_system_settings
, nofrom name
- la columna por la que agrupar se llama
category
, nosubdomain
- dado que el principio de la consulta es usar la agregación, necesita funciones agregadas para las columnas generadas, como
MAX()
; Las versiones anteriores de MySQL toleran no usar una función agregada en columnas no agregadas, pero eso no es algo a lo que deba acostumbrarse - es una buena práctica rodear el nombre de las columnas con acentos graves, en caso de que uno de los nombres entre en conflicto con una palabra reservada (este no es el caso en sus datos de muestra, pero probablemente no sea completo)
DISTINCT
probablemente no sea necesario, a menos que haya duplicadoname
s por categoría (en este caso, no dude en volver a agregarlo al código a continuación)- Nota al margen:
IFNULL(..., NULL)
no es operativo
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;
| category | 2fa | abc_processing_date | activate_new_approve_person | activate_new_schdule | additional_footer_for_person |
| -------- | --- | ------------------- | --------------------------- | -------------------- | ---------------------------- |
| acme | 0 | today | 1 | 1 | |