コードにはいくつかの問題があります-重力を減らすことによって:
- z_tmp_admin_system_settingsから
を選択する必要があります 、
from name
ではありません - グループ化する列は
category
と呼ばれます 、サブドメイン
ではありません - クエリの原則は集計を使用することであるため、
MAX()
などの生成された列の集計関数が必要です。;古いバージョンのMySQLは、集計されていない列で集計関数を使用しないことを許容しますが、それに慣れることはできません。 - 名前の1つが予約語と衝突する場合に備えて、列の名前をバッククォートで囲むことをお勧めします(これはサンプルデータには当てはまりませんが、おそらく包括的ではありません) >
-
DISTINCT
name
を複製していない限り、おそらく必要ありません。 ■カテゴリごと(この場合は、以下のコードに自由に追加してください) - 補足:
IFNULL(...、NULL)
ノーオペレーションです
コード:
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 | |