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í)
DISTINCTpravděpodobně není potřeba, pokud jste nezduplikovalinames 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 | |