题目描述
面试遇到这样一个问题:
有一个用户下载文件的表 'file_download',如下:
id | uid | fid | status |
---|---|---|---|
1 | 1 | 1 | 0 |
2 | 1 | 1 | 1 |
3 | 2 | 1 | 1 |
4 | 2 | 2 | 0 |
5 | 2 | 2 | 1 |
6 | 1 | 3 | 1 |
7 | 3 | 3 | 0 |
...
uid
代表用户ID,fid
代表文件ID,`status代表文件下载状态,0是失败,1是成功。
用户若下载文件失败,可以继续下载,一旦下载成功,就不会再下载该文件。
让查出用户第一次下载文件就成功的记录。
自己的思路
我给的答案是这样的:
SELECT * FROM file_download GROUP BY uid,fid HAVING `status`=1;
但是面试官似乎不太满意,问我是否还有其他的方法?
随便写的…应该不是最优解,但是结果应该是对的
解释一下,因为要查 第一次下载文件就成功的记录,所以
status = 1
的记录sum(status) group by uid, fid
得到的结果只有0
或者1
,1
表示成功count(*) group by uid, fid
是1
id
,因为聚合了所以不能直接拿id
,但是因为对应的数据只有一条,所以随便放一个sum(id)
或者min(id)
之类的都可以取到id