S vaším kódem je několik problémů – snížením gravitace:
- musíte vybrat
from z_tmp_admin_system_settings
, nikolifrom name
- sloupec, podle kterého se má seskupit, se nazývá
category
, nikolisubdomain
- protože principem dotazu je použití agregace, potřebujete agregační funkce pro vygenerované sloupce, jako je
MAX()
; staré verze MySQL tolerují nepoužívání agregační funkce na neagregovaných sloupcích, ale na to se nedá zvyknout - je dobrým zvykem obklopit názvy sloupců zpětným zaškrtnutím pro případ, že se některý z názvů střetává s vyhrazeným slovem (tak tomu není ve vašich ukázkových datech, ale pravděpodobně nejsou vyčerpávající)
DISTINCT
pravděpodobně není potřeba, pokud jste nezduplikovaliname
s na kategorii (v tomto případě ji můžete přidat zpět do níže uvedeného kódu)- Poznámka:
IFNULL(..., NULL)
je ne-op
Kód:
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 | |