Istnieje kilka problemów z twoim kodem - poprzez zmniejszenie grawitacji:
- musisz wybrać
from z_tmp_admin_system_settings, a niefrom name - kolumna do grupowania nazywa się
category, a niesubdomain - ponieważ zasadą zapytania jest użycie agregacji, potrzebujesz funkcji agregujących dla generowanych kolumn, takich jak
MAX(); stare wersje MySQL tolerują nieużywanie funkcji agregującej na niezagregowanych kolumnach, ale nie jest to coś, do czego należy się przyzwyczaić - Dobrą praktyką jest otaczanie nazw kolumn znakami wstecznymi na wypadek, gdyby jedna z nazw kolidowała ze słowem zastrzeżonym (nie dotyczy to przykładowych danych, ale prawdopodobnie nie są one wyczerpujące)
DISTINCTprawdopodobnie nie jest potrzebna, chyba że zduplikowałeśnames na kategorię (w tym przypadku możesz dodać go z powrotem do poniższego kodu)- Uwaga boczna:
IFNULL(..., NULL)jest zakazem
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 | |