У нас есть две таблицы, представляющие интерес для этого запроса.

Во-первых, у нас есть таблица музыкальных треков, каждая из которых имеет уникальный 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

0
Alex 11 Мар 2011 в 18:46
Проблема в том, что количество дорожек будет варьироваться, поэтому вы не знаете заранее, сколько столбцов должен вернуть ваш набор результатов. Если вы согласны с тем, что максимальное количество треков равно 10, то можно сделать уродливый запрос, который вернет 10 треков, и некоторые из них могут иметь значение NULL, если их меньше 10 для данного альбома. Но вы также можете просто вернуть одну строку для каждой комбинации альбома / трека, а затем построить свои данные, перебирая возвращенные строки.
 – 
Daniel Williams
11 Мар 2011 в 19:07
Не могли бы вы дать ответ? Можете пометить как ответили тогда ... :)
 – 
Alex
16 Мар 2011 в 00:27

3 ответа

Лучший ответ

Проблема в том, что количество дорожек будет варьироваться, поэтому вы не знаете заранее, сколько столбцов должен вернуть ваш набор результатов.

Если вы согласны с тем, что максимальное количество треков равно 10, то можно сделать уродливый запрос, который вернет 10 треков, и некоторые из них могут иметь значение NULL, если их меньше 10 для данного альбома.

Но вы также можете просто вернуть одну строку для каждой комбинации альбома / трека, а затем построить свои данные, перебирая возвращенные строки.

Ура ,

Даниил

1
Daniel Williams 16 Мар 2011 в 07:13

Все, что вам нужно добавить, это в основном 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
0
Galz 11 Мар 2011 в 19:11
Попробуйте сейчас - изменен на синтаксис JOIN. Столбец "Цена" - это целое число или текст? Если это текст, СУММ не сработает.
 – 
Galz
11 Мар 2011 в 19:12

Думаю, вам нужна опция 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 ... Возможно, вам потребуется внести соответствующие изменения.

0
DRapp 11 Мар 2011 в 19:13