内连接和分组依据错误

时间:2014-07-19 14:32:20

标签: sql join

我有两个表格: tbl_albumtbl_gallery

如何选择最后三张专辑的最后一张图片?

这些是我的表格列:

tbl_album:   Id,al_name
tbl_gallery: Id,album_id,ga_pic_title,ga_file_name

我使用此查询:

select al.Id, al.al_name, ga.ga_file_name 
from tbl_album al inner join tbl_gallery ga 
on al.Id=ga.album_id  order by Id desc

使用Group By子句时收到错误:

select al.Id, al.al_name, ga.ga_file_name 
from tbl_album al inner join tbl_gallery ga 
on al.Id=ga.album_id group by al.al_name order by Id desc
  

消息8120,级别16,状态1,行1列'tbl_album.Id'无效   在选择列表中,因为它不包含在聚合中   函数或GROUP BY子句。

我不想重复al_name列。

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

您必须将select list中的所有列添加到group by,如下所示(我认为您使用的是SQL ServerOther但不是MySQL) 。顺便说一句,为什么在发布的查询中需要group by

select al.Id, al.al_name, ga.ga_file_name 
from tbl_album al 
inner join tbl_gallery ga on al.Id=ga.album_id 
group by al.Id, al.al_name, ga.ga_file_name 
order by Id desc

答案 1 :(得分:0)

大多数数据库都支持row_number()功能,这对您想要做的事情有帮助:

select id, al_name, ga_filename
from (select al.Id, al.al_name, ga.ga_file_name,
            row_number() over (partition by al.id order by ga.id desc) as seqnum,
            dense_rank() over (order by al.id desc) as seqnum_album
      from tbl_album al inner join
           tbl_gallery ga
           on al.Id = ga.album_id
     ) t
where seqnum = 1 and seqnum_album <= 3;

请注意,我使用窗口函数dense_rank()来确定最后三张专辑。您也可以使用order by和一个限制行数的子句来执行此操作。不幸的是,后者取决于数据库,因此它可能是top 3limit 3fetch first 3 rows only,甚至是其他内容。

相关问题