2011-03-30 97 views
2

即时通讯不知道我是否可能要求...但它可能是大声笑。MySQL的选择计数器,集团按

基本上,我有两张表,曲目和专辑。

我想显示所有曲目的列表并从相册部分获取名称。

的表是这样的:

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_trackstitletbl_albumstitletbl_tracks,tbl_albums其中tbl_tracksalbum_id = tbl_albumsid GROUP BY tbl_trackstitle

现在打印出以下列表:

Track1 Artist1 
Track2 Artist1 
Track3 Artist1 
Track1 Artist2 

etc..etc ..

(曲目名称ARNT张贴我做,为清楚起见)

现在什么我想要做的是选择另一列,由艺术家数字每个轨道,所以上述查询将输出:

1 Track1 Artist1 
2 Track2 Artist1 
3 Track3 Artist1 
1 Track1 Artist2 

但我想这样做没有任何其他列添加到数据库或没有任何服务器端循环,我将如何做到这一点?

+0

请发布'tbl_tracks'表格模式。如果您没有提供排序的列,则不可能在没有表更改的情况下执行此操作。 – 2011-03-30 22:48:55

+0

对不起,忘了放在代码块 – Ozzy 2011-03-30 22:50:09

+0

通常的做法是每个表都有一个自动递增的id列。你为什么不使用tbl_tracks中的id col? – Alp 2011-03-30 22:51:19

回答

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; 
+0

如果最后一列让你恼火,把它放在一个子查询中,只选择前三列 – RichardTheKiwi 2011-03-30 23:00:12

+0

非常酷,这些MySQL内联变量是如何工作的...... – DRapp 2011-03-30 23:04:14

+0

''<魔鬼的拥护者>'如果磁道无序输入会发生什么? '' – 2011-03-30 23:08:09

0

我们需要做一些像ROW_NUMBER()OVER(Partition By AlbumTitle)。 基于此article中MySQ1中分析函数的定义。

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中未经测试。我刚刚阅读了上面的文章中的代码,并尝试遵循相同的方法。