MySQL Усечение результата при использовании Group_Concat и Concat - PullRequest
6 голосов
/ 17 декабря 2010

У меня есть следующий SQL (я удалил некоторые из выбранных файлов:

SELECT node_revisions.title                          AS 'Task', 
       node_revisions.body                           AS 'Description', 
       Date_format(field_due_date_value, '%e/%c/%Y') AS 'Due Date', 
       users.name                                    AS 'User Name', 
       (SELECT GROUP_CONCAT(Concat(CHAR(10),Concat_ws( ' - ', name, From_unixtime( TIMESTAMP, 
               '%e/%c/%Y' )),CHAR(10),COMMENT))
        FROM   comments 
        WHERE  comments.nid = content_type_task.nid) AS 'Comments' 
FROM   content_type_task 
       INNER JOIN users 
         ON content_type_task.field_assigned_to_uid = users.uid 
       INNER JOIN node_revisions 
         ON content_type_task.vid = node_revisions.vid 
ORDER  BY content_type_task.nid DESC 

. Это возвращает все мои задачи и все комментарии, связанные с задачей. У меня проблема в том, что комментарииполе, созданное с помощью * GROUP_CONCAT *, усекает выходные данные. Я не знаю почему и не знаю, как это преодолеть (похоже, это 341 символ)

Ответы [ 2 ]

11 голосов
/ 17 декабря 2010

GROUP_CONCAT () по умолчанию ограничено 1024 байтами.

Чтобы обойти это ограничение и разрешить до 100 КБ данных, добавить group_concat_max_len=102400 в my.cnf или запросите сервер, используя SET GLOBAL group_concat_max_len=102400.

8 голосов
/ 23 июня 2016

Как уже упоминал Андре, результат GROUP_CONCAT() ограничен group_concat_max_len байтами.

Однако при использовании GROUP_CONCAT с ORDER BY результат дополнительно усекается до на одну треть из group_concat_max_len. Вот почему ваш исходный результат был усечен до 341 (= 1024/3) байтов. Если вы удалите предложение ORDER BY, это должно вернуть до полных 1024 байта для Comments. Например:

CREATE TABLE MyTable
(
    `Id` INTEGER,
    `Type` VARCHAR(10),
    `Data` TEXT
);

INSERT INTO MyTable VALUES
(0, 'Alpha', 'ABCDEF'),
(1, 'Alpha', 'GHIJKL'),
(2, 'Alpha', 'MNOPQR'),
(3, 'Alpha', 'STUVWX'),
(4, 'Alpha', 'YZ'),
(5, 'Numeric', '12345'),
(6, 'Numeric', '67890');

SET SESSION group_concat_max_len = 26;

-- Returns 26 bytes of data
SELECT Type, GROUP_CONCAT(Data SEPARATOR '') AS AllData_Unordered
FROM MyTable
GROUP BY Type;

-- Returns 26/3 = 8 bytes of data
SELECT Type, GROUP_CONCAT(Data SEPARATOR '') AS AllData_Ordered
FROM MyTable
GROUP BY Type
ORDER BY Id;

DROP TABLE MyTable;

Вернется

Type    AllData_Unordered
Alpha   ABCDEFGHIJKLMNOPQRSTUVWXYZ
Numeric 1234567890

Type    AllData_Ordered
Alpha   ABCDEFGH
Numeric 12345678

Я не нашел такого взаимодействия между GROUP_CONCAT() и ORDER BY, упомянутого в Руководстве по MySQL , но оно затрагивает, по крайней мере, MySQL Server 5.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...