SELECT q.*, a.answer
FROM `questions` q
LEFT JOIN (
SELECT question_id, GROUP_CONCAT(text SEPARATOR '|| ') answer
FROM answers
GROUP BY question_id
) a ON q.uid = a.question_id
WHERE q.deleted = 0
GROUP BY q.uid
Этот запрос выбирает вопросы и ответы к ним, склеивая их. В табличке ответы хранятся в виде text. При выборке и конкатенации часть текста обрезается. Например если у меня 3 больших ответа, мне возвращает где-то целый первый ответ и половину второго. Если в базе все эти ответы сделать маленькими - все отлично. В чем здесь проблема?
Ответ
У функции GROUP_CONCAT есть ограничение на объем выводимых данных. По умолчанию 1024 символа для каждого объединения - для каждой выводимой строки. Если размер данных, полученных в результате конкатенации, больше, выводимый текст будет обрезан.
Чтобы расширить размер, нужно выполнить команду:
SET SESSION group_concat_max_len = 1000000;
или SET @@group_concat_max_len = 1000000; (аналогична предыдущей).
Но данная команда будет применена только к текущей сессии. По завершении сессии, например, при открытии нового соединения, значение данной переменной вернётся к начальному значению. Для установки глобальной переменной нужно выполнить следующую команду:
SET GLOBAL group_concat_max_len = 1000000;
Комментариев нет:
Отправить комментарий