SQL查询需求:统计各相册图片数并获取封面图片ID
解决相册图片统计与封面ID查询问题
嘿,我来帮你搞定这个SQL查询的问题!首先得说说你原来的查询语句为啥达不到预期效果:你把albumName和pictureId一起放到GROUP BY里了,这会让每一张图片都单独成为一个分组,所以统计出来的picsInAlbum其实都是1,而且根本没法聚合出每个相册的封面ID。
针对你的需求,我给你两种可行的解决方案:
方法一:使用条件聚合(推荐,更简洁)
这种方法只需要一次查询,通过CASE语句筛选出封面ID,再结合分组统计数量:
SELECT albumName AS ALBUM, COUNT(*) AS PICSINALBUM, MAX(CASE WHEN isCover = true THEN id END) AS coverPicId FROM PICTURES GROUP BY albumName;
逻辑解释:
GROUP BY albumName:按相册名称分组,确保每个相册只出一条结果COUNT(*):统计每个分组里的总图片数量MAX(CASE WHEN isCover = true THEN id END):因为每个相册只有一张封面(从你的示例数据来看),CASE语句会只提取封面图片的ID,MAX(或者用MIN也可以)会把这个唯一的ID保留下来
方法二:子查询关联
如果你更习惯用关联查询的方式,也可以先统计每个相册的图片数量,再关联到封面图片的记录:
SELECT cnt.albumName AS ALBUM, cnt.PICSINALBUM, cover.id AS coverPicId FROM ( -- 先统计每个相册的图片总数 SELECT albumName, COUNT(*) AS PICSINALBUM FROM PICTURES GROUP BY albumName ) cnt -- 关联到对应相册的封面图片 JOIN PICTURES cover ON cnt.albumName = cover.albumName AND cover.isCover = true;
把这两种SQL放到你的数据库里运行,都会得到你期望的结果:
| ALBUM | PICSINALBUM | coverPicId |
|---|---|---|
| test | 2 | 1 |
| test1 | 2 | 3 |
| test2 | 2 | 5 |
内容的提问来源于stack exchange,提问作者Hajrudin
相关产品推荐
相关产品推荐

