我有两个表格:
tbl_album
和tbl_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列。
有更好的方法吗?
答案 0 :(得分:0)
您必须将select list
中的所有列添加到group by
,如下所示(我认为您使用的是SQL Server
或Other
但不是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 3
,limit 3
或fetch first 3 rows only
,甚至是其他内容。