Es gibt mehrere Probleme mit Ihrem Code - durch Verringern der Schwerkraft:
- Sie müssen
from z_tmp_admin_system_settings
auswählen , nichtfrom name
- Die Spalte, nach der gruppiert werden soll, heißt
category
, nichtsubdomain
- Da das Prinzip der Abfrage darin besteht, Aggregation zu verwenden, benötigen Sie Aggregatfunktionen für die generierten Spalten, wie z. B.
MAX()
; alte MySQL-Versionen tolerieren die Verwendung einer Aggregatfunktion für nicht aggregierte Spalten, aber daran muss man sich nicht gewöhnen - Es empfiehlt sich, die Namen der Spalten in Backticks einzuschließen, falls einer der Namen mit einem reservierten Wort kollidiert (dies ist in Ihren Beispieldaten nicht der Fall, aber wahrscheinlich nicht vollständig)
DISTINCT
wird wahrscheinlich nicht benötigt, es sei denn, Sie habenname
dupliziert s pro Kategorie (in diesem Fall können Sie es gerne wieder zum unten stehenden Code hinzufügen)- Nebenbemerkung:
IFNULL(..., NULL)
ist ein 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 | |