От автора: В этом уроке мы познакомимся с такой интересной и полезной функцией языка SQL, как GROUP_CONCAT. Данная функция будет практически незаменима, когда нам нужно сгруппировать определенные данные выборки в строку.
Для примера мы возьмем 3 таблицы: таблицу фильмов, таблицу актеров и связующую таблицу, где с помощью связи многие-ко-многим мы свяжем обе таблицы выше, т.е. в третьей таблице мы будем хранить данные о том, в каком фильме снимался тот или иной актер. Дамп таблиц вы найдете в исходниках к уроку.
Итак, если мы воспользуемся стандартным объединением таблиц с помощью оператора JOIN, то мы получим не совсем тот вариант, который хотелось бы. Мы получим множество строк с дублирующимися данными. Для получения нужного результата мы как раз и воспользуемся функцией GROUP_CONCAT. Вот как будет выглядеть наш запрос:
1 2 3 4 5 |
$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"; |
Ну и небольшой скрипт, который будет выводить название фильма и актеров, которые снимались в нем. При этом имена актеров будут ссылками:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$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>"; } |
На этом я с вами прощаюсь. Удачи и до новых встреч!
Комментарии (1)