2016-05-20 3 views
1

Я пытаюсь описать дорожку, включая все связанные с ней детали.Несколько значений в одной ячейке

SELECT 
(SELECT 
UPPER(Track.Name) || ' is a ' || 
CAST(Track.Milliseconds/1000 AS INT) || ' seconds long track in the album ' || 
UPPER(Album.Title) || ' of ' || 
Artist.Name || ' composed by ' || 
CASE WHEN Track.Composer IS NULL THEN 'an unknown composer' ELSE Track.Composer END || 
'. ' || 'It is available as a ' || 
MediaType.Name || ' for $' || 
Track.UnitPrice || ', and it can be found in the following playlists: ' || 
Playlist.Name) 
AS 'Track Description' FROM Track 
LEFT JOIN Album 
ON Track.AlbumId=Album.AlbumId 
INNER JOIN Artist 
ON Artist.ArtistId=Album.ArtistId 
INNER JOIN MediaType 
ON Track.MediaTypeId=MediaType.MediaTypeId 
INNER JOIN PlaylistTrack 
ON PlaylistTrack.TrackId = Track.TrackId 
INNER JOIN Playlist 
ON Playlist.PlaylistId = PlaylistTrack.PlaylistId 
ORDER BY RANDOM() 
LIMIT 1; 

Я работаю с playlist.name. Один трек может быть в нескольких списках воспроизведения, и в настоящее время он выводит только верхний список воспроизведения. Я хочу знать, как я могу выводить все плейлисты, трек разделен запятыми после and it can be found in the following playlists: ' ||

ответ

0

Одна из стратегий заключается в использовании GROUP_CONCAT для объединения всех имен плейлистов, в которых отображается данный трек. Для этого вы можете GROUP BY каждого столбца, связанного с дорожкой , за исключением для имени плейлиста. Подзапрос вычисляет ваш результат в симпатичном формате из внутреннего запроса.

SELECT UPPER(t.trackName) || ' is a ' || 
    CAST(t.trackMillis/1000 AS INT) || ' seconds long track in the album ' || 
    UPPER(t.albumTitle) || ' of ' || 
    t.artistName || ' composed by ' || 
    CASE WHEN t.trackComposer IS NULL THEN 'an unknown composer' ELSE t.trackComposer END || 
    '. ' || 'It is available as a ' || 
    t.mediaTypeName || ' for $' || 
    t.trackUnitPrice || ', and it can be found in the following playlists: ' || t.playlistNames 
FROM 
(
    SELECT Track.Name AS trackName, Track.Milliseconds AS trackMillis, 
     Album.Title AS albumTitle, Artist.Name AS artistName, 
     Track.Composer AS trackComposer, MediaType.Name AS mediaTypeName, 
     Track.UnitPrice AS trackUnitPrice, GROUP_CONCAT(Playlist.Name) AS playlistNames 
    FROM Track 
    LEFT JOIN Album 
     ON Track.AlbumId = Album.AlbumId 
    INNER JOIN Artist 
     ON Artist.ArtistId = Album.ArtistId 
    INNER JOIN MediaType 
     ON Track.MediaTypeId = MediaType.MediaTypeId 
    INNER JOIN PlaylistTrack 
     ON PlaylistTrack.TrackId = Track.TrackId 
    INNER JOIN Playlist 
     ON Playlist.PlaylistId = PlaylistTrack.PlaylistId 
    GROUP BY Track.Name, Track.Milliseconds, Album.Title, Artist.Name, 
     Track.Composer, MediaType.Name, Track.UnitPrice 
) t