我不确定我所要求的是否可能……但它很可能是哈哈。
基本上,我有两张桌子,曲目和专辑。
我想要显示所有曲目的列表,并从唱片集部分获取名称。
这些表格如下所示:
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现在,我运行查询:
选择tbl_tracks。title,tbl_albums。title FROM tbl_tracks,tbl_albums WHERE tbl_tracks.album_id =tbl_albums。<代码>D11 GROUP BY <代码>D12。<代码>D13
现在打印出以下列表:
Track1 Artist1
Track2 Artist1
Track3 Artist1
Track1 Artist2etc..etc..
(曲目名称并不是张贴的,为了清楚起见我这样做了)
现在我想要做的是选择另一个列,根据艺术家对每个曲目进行编号,这样上面的查询就会输出:
1 Track1 Artist1
2 Track2 Artist1
3 Track3 Artist1
1 Track1 Artist2但是我想在没有任何其他列添加到数据库中或者没有任何服务器端循环的情况下这样做,我该怎么做呢?
发布于 2011-03-31 06:59:21
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;发布于 2011-03-31 07:18:10
我们需要在(AlbumTitle分区)上做一些像ROW_NUMBER()这样的事情。基于此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中没有经过测试。我只是阅读了上面文章中的代码,并尝试遵循相同的方法。
https://stackoverflow.com/questions/5493389
复制相似问题