Der er flere problemer med din kode - ved at reducere tyngdekraften:
- du skal vælge
from z_tmp_admin_system_settings, ikkefrom name - kolonnen, der skal grupperes efter, kaldes
category, ikkesubdomain - da princippet i forespørgslen er at bruge aggregering, har du brug for en aggregeret funktion for de genererede kolonner, såsom
MAX(); gamle versioner af MySQL tolererer ikke at bruge en aggregeret funktion på ikke-aggregerede kolonner, men det er ikke noget man skal vænne sig til - det er en god praksis at omgive navnet på kolonnerne med backticks, hvis et af navnene kolliderer med et reserveret ord (dette er ikke tilfældet i dine eksempeldata, men det er sandsynligvis ikke udtømmende)
DISTINCTer sandsynligvis ikke nødvendig, medmindre du har duplikeretnames pr. kategori (i dette tilfælde er du velkommen til at tilføje den tilbage til nedenstående kode)- Sidebemærkning:
IFNULL(..., NULL)er en no-op
Kode:
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 | |