У нас есть две таблицы, представляющие интерес для этого запроса.
Во-первых, у нас есть таблица музыкальных треков, каждая из которых имеет уникальный PK, а также FK, указывающий на альбом, к которому принадлежит трек. Вторая таблица - это таблица альбома.
Итак, у нас есть около 10 строк треков на 1 строку альбома.
Я пытаюсь объединить все треки, принадлежащие одному альбому, в одну строку, плюс название альбома (которое хранится в альбомах). Это сделано для того, чтобы избежать неудобного кода PHP.
На данный момент у нас есть:
SELECT Album.Image_URL, Track.Track_Title, Track.Price
FROM Album, Track, Artist
WHERE (Album.Album_ID=Track.Album_ID) AND (Artist.Artist_ID=Track.Artist_ID)
ORDER BY Album.Album_Name ASC
Это по одной дорожке в строке, каждая с правильной информацией об альбоме. Однако хотелось бы, чтобы в этом альбоме треки располагались в один ряд.
Ценю любую помощь, A
3 ответа
Проблема в том, что количество дорожек будет варьироваться, поэтому вы не знаете заранее, сколько столбцов должен вернуть ваш набор результатов.
Если вы согласны с тем, что максимальное количество треков равно 10, то можно сделать уродливый запрос, который вернет 10 треков, и некоторые из них могут иметь значение NULL, если их меньше 10 для данного альбома.
Но вы также можете просто вернуть одну строку для каждой комбинации альбома / трека, а затем построить свои данные, перебирая возвращенные строки.
Ура ,
Даниил
Все, что вам нужно добавить, это в основном GROUP BY Albums.Album_ID
:
SELECT Album.Image_URL, Album.Album_Name, SUM(Track.Price) As total_price
FROM Album
JOIN Track ON Album.Album_ID=Track.Album_ID
JOIN Artist ON Artist.Artist_ID=Track.Artist_ID
GROUP BY Albums.Album_ID
ORDER BY Album.Album_Name ASC
Думаю, вам нужна опция GROUP_CONCAT (). Итак, для одного ключа сгруппируйте в виде списка, разделенного запятыми, для всех других ... Что-то вроде
select
Album.ID, (assuming this column name since not provided)
Album.Title,
Album.Image_URL,
Group_CONCAT( Track.Track_Title ) All_Tracks
from
Album
join Tracks
on Album.Album_ID=Track.Album_ID
join Artist
onTrack.Artist_ID = Artist.Artist_ID
group by
1
Если вы хотите повысить цену каждого названия трека, просто объявите это как часть GROUP_CONCAT () ... Не могу подтвердить синтаксис, но что-то вроде
TRIM (Track.Track_Title + "(" + Track.Price + ")"), поэтому объединение может выглядеть примерно так
Album ID Title Image Url AllTracks
1 Some Album Some URL First Track ($.99), Second Track, ($1.29), Third Track...
Однако разве Артист действительно не связан с АЛЬБОМОМ, а не с треком? Или вас интересует информация о Song Writer ... Возможно, вам потребуется внести соответствующие изменения.
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.