26 августа 2008

Один SQL скрипт

Возникла такая задача:

Нужно с помощью одного SQL скрипта (MySQL 5!) выбрать из двух таблиц информацию так, чтобы в одном из столбцов были данные через запятую (в общем случае через разделитель), например:

IDDescr
1A
2B
+
IDData
1a
1b
1c
2d
2e
=
IDData
1a, b, c
2d, e

Довольно простая задача, если бы не требовался всего один скрипт или если бы это был MS-SQL(T-SQL) например.

Недолгое гугление привело меня к простому решению.

Есть такая функция в MySQL начиная с 4.1 версии: GROUP_CONCAT(). Она преобразовывает данные полученные с помощью GROUP BY в строку с произвольными разделителями, да еще и имеет несколько полезных параметров, например сортировку.

В результате получаем такой небольшой скрипт:

SELECT ID, GROUP_CONCAT(Data SEPARATOR ', ') as 'Data'
FROM Table1
JOIN Table2 ON Table1.ID=Table2.ID
GROUP BY Table1.ID

UPD:

Обнаружилось позднее: GROUP_CONCAT имеет по умолчанию ограничение по длине 1024 символа. Для чего - не понятно. Если бы хотя бы 1024 записей, то данные не обрывались бы.

Лечится так:
Единожны выполнить следующий скрипт над базой, используя любую необходимую длину, как больше 1024, так и меньше.

SET @@global.group_concat_max_len=любое число;

Если сервер не позволяет устанавливать глобальное значение (такое бывает для shared серверов на хостингах), тогда в каждой сессии обращения к БД, перед использованием GROUP_CONCAT нужно выполнять это:

SET @@session.group_concat_max_len=любое число;