Всі ми знаємо про чудові функції PHP такі як implode (об'єднує елементи масиву в рядок заданим роздільником) і explode (розбиває рядок в масив по заданому разделителю).
Але іноді розробникам доводиться оперувати рядками з роздільником (денормалізованнимі даними) або ж навпаки - отримати будь-які дані об'єднані через роздільник в базі даних. Як виявилося зробити це в MySQL не так просто. Після невеликого копання в документації виявилося, що для об'єднання записів в рядок можна скористатися функцій GROUP_CONCAT. За замовчуванням роздільником є кома (символ «,»). Але його можна змінити використовую параметр SEPARATOR. Наведемо невеликий приклад.
Нехай у нас є таблиця зі списком користувачів - «users». З неї необхідно вибрати все ID користувачів і зібрати в рядок з роздільником.
І трохи заповнених даних:
Тепер виконаємо наступний запит для об'єднання даних в рядок:
В результаті ми отримаємо наступний набір даних:
Тепер об'єднаємо дані через символ «крапка з комою» ( «;») виконавши наступний запит з використанням параметра SEPARATOR.
В результаті вибірка прийняла ось таке значення:
Ось так за допомогою функції GROUP_CONCAT можна об'єднувати будь-які дані з Бази Даних через роздільник. Крім того, в функцію можна передавати кілька полів для їх конкатенації (склеювання). Що б уникнути повторювані дані, можна використовувати параметр DISTINCT.
У цій функції є обмеження на обсяг даних, що виводяться. За замовчуванням 1024 символів для кожного об'єднання - для кожної рядка, що виводиться. Якщо розмір склеєних даних більше, то він буде урізати. Щоб розширити розмір потрібно виконати команду (тільки якщо у Вас є необхідні привілеї на Виконання покрівельних)
З об'єднанням даних на цьому все. А ось що б розібрати рядок через розділовий знак, який з цим доведеться повозитися довше. Нативної підтримки цього в MySQL я не знайшов. Єдине цього рішення - написання процедури, що для розбору рядка.
Нижче представлений дамп збереженої процедури.
Процедура приймає всього 1 параметр (для прикладу). Це список значень через кому. Після цього проходить цикл за цим параметром і шукається роздільник (в нашому випадку - це кома). Кожне нове значення зберігається в змінну @sHead і його вже можна використовувати для SQL запитів.
Для виклику процедури скористаємося наступним кодом.
Після чого нові ID користувачів з'являться в таблиці. Це досить простий приклад. Найчастіше такі операції я використовую для зберігання денормалізованних даних і подальшої їх нормалізації (через тригер).
Само собою пошук робиться по нормалізованим даними, а, якщо, необхідно просто вивести інформацію - висновок денормалізованних.
Дану процедуру Ви можете змінити і вже використовувати для своїх потреб.
Можливо також вам буде цікаво:
- Створення Doctrine YAML через MySQL Workbench
- Встановлюємо Apache 2, PHP 5.3 і MySQL 5.1 на ...