PHP MySQL Обрабатывать результаты GROUP_CONCAT как отдельные элементы.

Я делаю базу данных классификации музыки, используя PHP и MySQL.
У меня есть три таблицы:

Песня:

ID  | Title
------------------------
1   | Example Song

Жанр:

ID  | Name
------------------------
1   | Classical
2   | Instrumental

SongGenre

SongID | GenreID
----------------
1      | 1
1      | 2

Мой запрос:

SELECT s.title, GROUP_CONCAT(DISTINCT g.name SEPARATOR ', ')
FROM song s
LEFT JOIN songgenre sg ON s.id=sg.s_id
LEFT JOIN genre g ON sg.genreid = g.id

Я использую GROUP_CONCAT для разрешения нескольких жанров, как показано:

Название: «Пример песни» Жанры: Классика, Инструментальная

Я хочу создать ссылку на PHP для каждого жанра, чтобы, если пользователь нажимает «Классика», он попадает в другие песни, перечисленные как Классические. Вопрос в том, я не уверен, как дать каждому жанру собственную ссылку. Проблема с GROUP_CONCAT заключается в том, что оба жанра возвращаются вместе в одной строке, и я не уверен, как разделите строку на части, чтобы добавить ссылку на каждый отдельный жанр.

0

Решение

очень простой пример по просьбе OP

$var="Classical, Instrumental";

$each=explode(', ',$var);

foreach($each as $v){
echo '<a href="search.php?genre='.$v.'">'.$v.'</a>';
}
1

Другие решения

Не группировать внутри слоя базы данных — вернуть несгруппированный (но отсортировано) записать в PHP и обработать его оттуда:

$qry = $pdo->query('
SELECT   sg.SongID, sg.GenreID, s.Title, g.Name
FROM     song s
LEFT JOIN songgenre sg ON s.ID = sg.SongID
LEFT JOIN genre g ON sg.GenreID = g.ID
ORDER BY sg.SongID, sg.GenreID
');

if ($qry) {
echo '<ul class="songs">';

$row = $qry->fetch();
while ($row) {
$current_song = $row['SongID'];

echo '<li>'
,   '<span class="title">', htmlentities($row['Title']), '</span>'
,   '<ul class="genres">';
do {
echo   '<li>'
,     '<a href="genre.php?id=', intval($row['GenreID']), '">'
,       htmlentities($row['Name'])
,     '</a>'
,   '</li>';
} while ($row = $qry->fetch() and $row['SongID'] == $current_song);

echo   '</ul>'
, '</li>';
}

echo '</ul>';
}
1

По вопросам рекламы [email protected]