我不确定我要求的是否可能......但它可能是大声笑。
基本上,我有两张桌子,曲目和专辑。
我想显示所有曲目的列表,并从专辑部分获取名称。
表格如下:
tbl_tracks
id - int, auto increment, primary key
album_id - int
title - varchar 50
和
tbl_albums
id - int, auto increment, primary key
title - varchar 50
现在,我运行查询:
SELECT tbl_tracks
。title
,tbl_albums
。title
FROM tbl_tracks
,tbl_albums
WHERE tbl_tracks
。{{1} } = album_id
。tbl_albums
GROUP BY id
。tbl_tracks
现在打印出以下列表:
title
etc..etc ..
(为了清楚起见,我发布的曲目名称为<)>
现在我要做的是选择另一个按艺术家为每个曲目编号的列,以便上面的查询输出:
Track1 Artist1
Track2 Artist1
Track3 Artist1
Track1 Artist2
但我想在没有任何其他列添加到数据库或没有任何服务器端循环的情况下这样做,我该怎么做?
答案 0 :(得分:2)
SELECT @rn := if(@g = tbl_albums.id, @rn+1, 1) rownumber,
tbl_tracks.title, tbl_albums.title,
@g := tbl_albums.id
FROM (select @g:=null, @rn:=0) initvars
CROSS JOIN tbl_tracks
INNER JOIN tbl_albums on tbl_tracks.album_id = tbl_albums.id
ORDER BY tbl_albums.id, tbl_tracks.title;
答案 1 :(得分:0)
我们需要做一些像ROW_NUMBER()OVER(Partition By AlbumTitle)这样的事情。 基于此article中为MySQl中的分析函数定义的技巧。
SELECT MO.*,
@_rowNumber := @_rowNumber + 1
FROM
(
SELECT m.*
FROM
(
Select @_albumTitle := NULL
) V,
(
SELECT tbl_tracks.title As TrackTitle,
tbl_albums.title As AlbumTitle
FROM tbl_tracks,
tbl_albums
WHERE tbl_tracks.album_id = tbl_albums.id
) m
ORDER BY m.AlbumTitle,m.TrackTitle
) MO
WHERE (CASE WHEN @_albumTitle IS NULL
OR @_albumTitle <> MO.AlbumTitle THEN @_rowNumber := 0 END IS NOT NULL)
AND (@_albumTitle := MO.AlbumTitle) IS NOT NULL
注意:我只有MS SQL的经验,所以这个查询在语法上可能是错误的。此查询在MySql中未经测试。我只是阅读上面的文章中的代码,并尝试遵循相同的方法。