Det finns flera problem med din kod - genom att minska gravitationen:
- du måste välja
from z_tmp_admin_system_settings
, intefrom name
- kolumnen att gruppera efter kallas
category
, intesubdomain
- eftersom principen för frågan är att använda aggregering, behöver du en aggregerad funktion för de genererade kolumnerna, såsom
MAX()
; gamla versioner av MySQL tål att inte använda en aggregerad funktion på icke-aggregerade kolumner, men det är inte något att vänja sig vid - det är en god praxis att omge namnet på kolumnerna med backticks, om ett av namnen krockar med ett reserverat ord (detta är inte fallet i dina exempeldata, men det är förmodligen inte heltäckande)
DISTINCT
behövs förmodligen inte, om du inte har dupliceratname
s per kategori (i det här fallet får du gärna lägga till den i koden nedan)- Sidonot:
IFNULL(..., NULL)
är ett nej
Kod:
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 | |