Функція GROUP_CONCAT в MySQL. Групування вибірки

19

Від автора: У цьому уроці ми познайомимося з такою цікавою і корисною функцією мови SQL, як GROUP_CONCAT. Дана функція буде практично незамінна, коли нам потрібно згрупувати певні дані вибірки в рядок.

Функція GROUP_CONCAT в MySQL. Групування вибіркиФункція GROUP_CONCAT в MySQL. Групування вибірки

Для прикладу ми візьмемо 3 таблиці: таблицю фільмів, таблицю акторів і перехідну таблицю, де з допомогою зв’язку багато-до-багатьом ми з’єднаємо обидві таблиці вище, тобто в третій таблиці ми будемо зберігати дані про те, в якому фільмі знімався той чи інший актор. Дамп таблиць ви знайдете в исходниках до уроку.

Отже, якщо ми скористаємося стандартними об’єднанням таблиць за допомогою оператора JOIN, то ми отримаємо не зовсім той варіант, який хотілося б. Ми отримаємо безліч рядків з дублюючими даними. Для отримання потрібного результату ми як раз і скористаємося функцією GROUP_CONCAT. Ось як буде виглядати наш запит:

$query = «SELECT films.*, GROUP_CONCAT(actors.name) AS actors_name, GROUP_CONCAT(actors.actor_id) AS actors_id,film_actor.position FROM films
LEFT JOIN film_actor ON film_actor.film_id = films.film_id
GROUP BY films.film_id
ORDER BY films.film_id»;

Ну і невеликий скрипт, який буде виводити назву фільму і акторів, які знімалися в ньому. При цьому імена акторів будуть посиланнями:

$db = new mysqli(‘localhost’, ‘root’, «, ‘test’);
$db->set_charset(‘utf8’);
$query = «SELECT films.*, GROUP_CONCAT(actors.name) AS actors_name, GROUP_CONCAT(actors.actor_id) AS actors_id,film_actor.position FROM films
LEFT JOIN film_actor ON film_actor.film_id = films.film_id
LEFT JOIN actors ON actors.actor_id = film_actor.actor_id
GROUP BY films.film_id
ORDER BY films.film_id»;
$res = $db->query($query);
$films = $res->fetch_all(MYSQLI_ASSOC);
foreach($films as $film){
$actors_name = explode(‘,’, $film[‘actors_name’]);
$actors_id = explode(‘,’, $film[‘actors_id’]);
$actors = array_combine($actors_id, $actors_name);
$roles = ‘У ролях: ‘;
foreach($actors as $id => $actor) $roles .= «{$actor}, «;
echo «Назва фільму: {$film[‘film_name’]}
«;
echo $roles = rtrim($roles, ‘, ‘);
echo «»;
}

На цьому я з вами прощаюся. Удачі і до нових зустрічей!