将行聚合为单个新行,以及来自其他表的数据

时间:2011-03-11 15:46:58

标签: mysql

我们在此查询中有两个感兴趣的表。

首先,我们有一张音乐曲目表,每张曲目都有一个独特的PK,还有一个FK指向该曲目所属的专辑。第二个表是此相册表。

所以我们每一行专辑有大约10行曲目。

我正在尝试将属于一个专辑的所有曲目合并为一行,加上专辑标题(保存在专辑中)。这是为了避免繁琐的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

这是每行一首曲目,每首曲目都有正确的专辑信息。但是我想将这张专辑曲目分成一行。

感谢任何帮助, 甲

3 个答案:

答案 0 :(得分:1)

问题是曲目的数量会有所不同,因此您不能提前知道结果集应返回多少列。

如果您愿意接受最大曲目数为10,则可能会生成一个丑陋的查询,这将返回10个曲目,如果给定的专辑少于10个,则其中一些可能为NULL 。

但是你也可以在每个专辑/曲目组合中返回一行,然后通过迭代返回的行来构建你的数据。

干杯,

丹尼尔

答案 1 :(得分:0)

您需要添加的内容基本上是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

答案 2 :(得分:0)

我认为你需要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...

然而,艺术家是否真的与ALBUM相关联而非赛道?或者您对歌曲作者信息感兴趣......您可能需要相应调整。