Có một số vấn đề với mã của bạn - bằng cách giảm trọng lực:
- bạn cần chọn
from z_tmp_admin_system_settings
, không phảifrom name
- cột để nhóm theo được gọi là
category
, không phảisubdomain
- vì nguyên tắc của truy vấn là sử dụng tính năng tổng hợp, bạn cần một hàm tổng hợp cho các cột được tạo, chẳng hạn như
MAX()
; các phiên bản cũ của MySQL có thể chấp nhận được việc không sử dụng hàm tổng hợp trên các cột không được tổng hợp, nhưng đó không phải là điều nên làm quen với - một thực tiễn tốt là bao quanh tên của các cột bằng dấu gạch ngược, trong trường hợp một trong các tên xung đột với một từ dành riêng (đây không phải là trường hợp trong dữ liệu mẫu của bạn, nhưng nó có lẽ không toàn diện)
-
DISTINCT
có thể không cần thiết, trừ khi bạn cóname
trùng lặp s cho mỗi danh mục (trong trường hợp này, vui lòng thêm lại vào mã bên dưới) - Ghi chú bên lề:
IFNULL(..., NULL)
là một điều không cần tham gia
Mã:
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;
Bản trình diễn trên DB Fiddle :
| category | 2fa | abc_processing_date | activate_new_approve_person | activate_new_schdule | additional_footer_for_person |
| -------- | --- | ------------------- | --------------------------- | -------------------- | ---------------------------- |
| acme | 0 | today | 1 | 1 | |