Không giống như một số RDBMS khác, MySQL không có hỗ trợ riêng cho các hoạt động xoay vòng loại này theo thiết kế (các nhà phát triển cảm thấy nó phù hợp với bản trình bày hơn là cơ sở dữ liệu, lớp ứng dụng của bạn).
Nếu bạn hoàn toàn phải thực hiện các thao tác như vậy trong MySQL, thì việc xây dựng một câu lệnh chuẩn bị là cách tốt nhất để đi — mặc dù thay vì làm rối tung CASE
, Tôi có thể chỉ sử dụng GROUP_CONCAT()
chức năng:
SELECT CONCAT(
'SELECT `table`.id', GROUP_CONCAT('
, `t_', REPLACE(name, '`', '``'), '`.value
AS `', REPLACE(name, '`', '``'), '`'
SEPARATOR ''),
' FROM `table` ', GROUP_CONCAT('
LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '`
ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id
AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name)
SEPARATOR ''),
' GROUP BY `table`.id'
) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t;
PREPARE stmt FROM @qry;
EXECUTE stmt;
Xem nó trên sqlfiddle .
Lưu ý rằng kết quả của GROUP_CONCAT()
bị giới hạn bởi group_concat_max_len
biến (mặc định là 1024 byte:không có liên quan ở đây trừ khi bạn có một số name
cực kỳ dài giá trị).