2

我有一个 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 个元数据名称中获取过长的文本?

提前致谢

4

1 回答 1

3

是的,这可能是 GROUP_CONCAT 函数的问题,它有一个限制。

运行此查询 -SELECT @@local.group_concat_max_len;它将返回 GROUP_CONCAT() 函数的最大允许结果长度。

您需要增加此值,例如 -

SET @@local.group_concat_max_len=10000;
于 2013-04-26T07:33:42.407 回答