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)
DISTINCT
prawdopodobnie nie jest potrzebna, chyba że zduplikowałeśname
s 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 | |