我有一个 mySQL 存储过程,可以处理表中的少量数据:
SQL Fiddle Demo -> 感谢 Mahmoud Gamal。
问题是这个程序不适用于许多元数据:
CREATE TABLE Metadata (`metadata_id` int, `metadata_name` varchar(25)) ;
INSERT INTO Metadata
(`metadata_id`, `metadata_name`)
VALUES
(1, 'duration'),
(2, 'extension'),
(3, 'size'),
(4, 'duration2'),
(5, 'extension2'),
(6, 'size2'),
(7, 'duration3'),
(8, 'extension3'),
(9, 'size3'),
(10, 'duration4'),
(11, 'extension4'),
(12, 'size4'),
(13, 'duration5'),
(14, 'extension5'),
(15, 'size5'),
(16, 'duration6'),
(17, 'extension6'),
(18, 'size6')
;
似乎用 @ 声明的会话变量太短了!
这个表最后将有大约 150 个元数据。
SET @sql = NULL;
SET @cols = NULL;
SELECT
GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(m.metadata_name = ''',
m.metadata_name, ''', v.value, 0)) AS ', '''', m.metadata_name, '''')
) INTO @cols
FROM Metadata AS m;
SET @sql = CONCAT('
SELECT
v.file, ', @cols ,'
FROM `values` AS v
INNER JOIN metadata AS m ON v.metadata_id = m.metadata_id
GROUP BY v.file');
prepare stmt
FROM @sql;
execute stmt;
这两个变量适用于本演示@sql
中@cols
的简单场景,但在我的情况下,我有 150 个元数据,在这种情况下,我收到一个错误,即变量太短。
如何声明这两个变量,以便它们从连接 150 个元数据名称中获取过长的文本?
提前致谢