id | user_id | album_id | sort
1 15 1 1
2 15 1 2
3 15 1 0
4 15 2 0
5 15 2 1
6 15 3 0
SELECT id, sort, COUNT(*) FROM images WHERE user_id=15 GROUP BY album_id
查询每个唯一组合返回一行。但是,如何判断它选择哪一行id
?例如。 sort=0
的图像是专辑的封面图像。此图像的文件路径包含id
。那么,怎么可能总是得到行的id,sort=0
?
我已尝试MIN(sort)
,0
列中始终返回sort
,但不是该列的id
... ORDER BY sort
只对结果进行排序......也不是解决方案。
非常感谢任何帮助!非常感谢你提前!
编辑:希望这有助于更好地理解:
查询,例如得出以下结果:
id | sort | count
1 1 3
4 0 2
6 0 1
但是,如何始终获得sort
的{{1}}值为0
的特定行? E.g。
id | sort | count
3 0 3
4 0 2
6 0 1
答案 0 :(得分:1)
首先,过滤封面图片(WHERE sort = 0
),然后只计算album_id
的所有图片。
SELECT id,
sort,
(SELECT COUNT(*)
FROM images t
WHERE t.album_id = i.album_id) AS count
FROM images i
WHERE user_id = 15
AND sort = 0
答案 1 :(得分:1)
有一种方法可以在没有相关子查询的情况下执行此操作:
SELECT id, sort, isum.cnt
FROM images i join
(select i.album_id, count(*) as cnt
from images
) isum
on i.album_id = isum.album_id
WHERE user_id = 15 and
sort = 0
我通常更喜欢在“from”子句中列出所有表格。但是,当album_id上有索引时,某些数据库会比此表单更好地优化相关子查询。
另外,我将第三个字段从“count”重命名为“cnt”。在SQL保留字之后命名列是一个非常非常糟糕的主意,除非你真的必须这样做。
最后,SQL的大多数其他方言都支持窗口函数。因此,如果您更改数据库,则可以执行类似
的操作select id, sort, count(*) over (partition by album_id)
from images
where user_id = 15 and
sort = 0