Er zijn verschillende problemen met uw code - door de zwaartekracht te verminderen:
- je moet
from z_tmp_admin_system_settings
, nietfrom name
- de kolom om op te groeperen heet
category
, nietsubdomain
- aangezien het principe van de query is om aggregatie te gebruiken, hebt u aggregatiefuncties nodig voor de gegenereerde kolommen, zoals
MAX()
; oude versies van MySQL tolereren het niet gebruiken van een aggregatiefunctie op niet-geaggregeerde kolommen, maar dat is niet iets om aan te wennen - het is een goede gewoonte om de naam van de kolommen te omringen met backticks, voor het geval een van de namen botst met een gereserveerd woord (dit is niet het geval in uw voorbeeldgegevens, maar het is waarschijnlijk niet volledig)
DISTINCT
is waarschijnlijk niet nodig, tenzij jename
. hebt gedupliceerd s per categorie (in dit geval, voel je vrij om het weer toe te voegen aan de onderstaande code)- Kanttekening:
IFNULL(..., NULL)
is een no-op
Code:
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 | |