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

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

От автора: В этом уроке мы познакомимся с такой интересной и полезной функцией языка SQL, как GROUP_CONCAT. Данная функция будет практически незаменима, когда нам нужно сгруппировать определенные данные выборки в строку.

скачать исходникискачать урок

Для примера мы возьмем 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
		LEFT JOIN actors ON actors.actor_id = film_actor.actor_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 .= "<a href='?actor_id={$id}'>{$actor}</a>, ";

	echo "Название фильма: {$film['film_name']}<br>";
	echo $roles = rtrim($roles, ', ');
	echo "<hr>";
}

На этом я с вами прощаюсь. Удачи и до новых встреч!

Хотите изучить MySQL?

Прямо сейчас посмотрите 24-х часовой курс по базе данных MySQL!

Смотреть курс

Метки: ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (1)

  1. Роберт Мальгинов

    Здравствуйте! Я пока в этом не разбираюсь, по этому воздержусь от комментария. Извините! Но я очень хочу научиться, помогите мне , будьте снесходительны!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree