Mysql implode, explode - блог вячеслава волкова

Всі ми знаємо про чудові функції PHP такі як implode (об'єднує елементи масиву в рядок заданим роздільником) і explode (розбиває рядок в масив по заданому разделителю).

Але іноді розробникам доводиться оперувати рядками з роздільником (денормалізованнимі даними) або ж навпаки - отримати будь-які дані об'єднані через роздільник в базі даних. Як виявилося зробити це в MySQL не так просто. Після невеликого копання в документації виявилося, що для об'єднання записів в рядок можна скористатися функцій GROUP_CONCAT. За замовчуванням роздільником є ​​кома (символ «,»). Але його можна змінити використовую параметр SEPARATOR. Наведемо невеликий приклад.

Нехай у нас є таблиця зі списком користувачів - «users». З неї необхідно вибрати все ID користувачів і зібрати в рядок з роздільником.

І трохи заповнених даних:

Mysql implode, explode - блог вячеслава волкова

Тепер виконаємо наступний запит для об'єднання даних в рядок:

В результаті ми отримаємо наступний набір даних:

Тепер об'єднаємо дані через символ «крапка з комою» ( «;») виконавши наступний запит з використанням параметра SEPARATOR.

В результаті вибірка прийняла ось таке значення:

Ось так за допомогою функції GROUP_CONCAT можна об'єднувати будь-які дані з Бази Даних через роздільник. Крім того, в функцію можна передавати кілька полів для їх конкатенації (склеювання). Що б уникнути повторювані дані, можна використовувати параметр DISTINCT.

У цій функції є обмеження на обсяг даних, що виводяться. За замовчуванням 1024 символів для кожного об'єднання - для кожної рядка, що виводиться. Якщо розмір склеєних даних більше, то він буде урізати. Щоб розширити розмір потрібно виконати команду (тільки якщо у Вас є необхідні привілеї на Виконання покрівельних)

З об'єднанням даних на цьому все. А ось що б розібрати рядок через розділовий знак, який з цим доведеться повозитися довше. Нативної підтримки цього в MySQL я не знайшов. Єдине цього рішення - написання процедури, що для розбору рядка.

Нижче представлений дамп збереженої процедури.

Процедура приймає всього 1 параметр (для прикладу). Це список значень через кому. Після цього проходить цикл за цим параметром і шукається роздільник (в нашому випадку - це кома). Кожне нове значення зберігається в змінну @sHead і його вже можна використовувати для SQL запитів.

Для виклику процедури скористаємося наступним кодом.

Після чого нові ID користувачів з'являться в таблиці. Це досить простий приклад. Найчастіше такі операції я використовую для зберігання денормалізованних даних і подальшої їх нормалізації (через тригер).

Само собою пошук робиться по нормалізованим даними, а, якщо, необхідно просто вивести інформацію - висновок денормалізованних.

Дану процедуру Ви можете змінити і вже використовувати для своїх потреб.

Можливо також вам буде цікаво:

  • Mysql implode, explode - блог вячеслава волкова
    Створення Doctrine YAML через MySQL Workbench
  • Встановлюємо Apache 2, PHP 5.3 і MySQL 5.1 на ...

Схожі статті