题解 | #网易云音乐推荐(网易校招笔试真题)#

网易云音乐推荐(网易校招笔试真题)

http://www.nowcoder.com/practice/048ed413ac0e4cf4a774b906fc87e0e7

原来我是将distinct和order by一起使用,但是发现运行报错:
SQL_ERROR_INFO: "Expression #1of ORDER BY clause is not in SELECT list,
references column 'm.id'which is not in SELECT list; thisis incompatible with DISTINCT"
查了一下,发现这是因为先执行distinct去重产生虚拟表,在此虚拟表的基础上进行order by,由于虚拟表没有order by的字段,产生报错
也就是order by的字段必须在select中出现
原代码如下:
select distinct music_name
from follow t1 join music_likes t2 on follower_id=t2.user_id
join music t3 on t2.music_id=t3.id
where  t1.user_id=1 and t3.music_name not in (
select music_name
from music_likes t2 join music t3 on t2.music_id=t3.id
where t2.user_id=1)
order by t2.music_id
由于报错,用group by替代distinct:
select music_name
from follow t1 join music_likes t2 on follower_id=t2.user_id
join music t3 on t2.music_id=t3.id
where  t1.user_id=1 and t3.music_name not in (
select music_name
from music_likes t2 join music t3 on t2.music_id=t3.id
where t2.user_id=1)
group by t2.music_id
order by t2.music_id
如果一定要用distinct也可以这么写:
select music_name
from (
select distinct music_name,id
from follow t1 join music_likes t2 on follower_id=t2.user_id
join music t3 on t2.music_id=t3.id
where t1.user_id=1) t4
where t4.music_name not in (
select music_name
from music_likes t2 join music t3 on t2.music_id=t3.id
where t2.user_id=1)
order by t4.id




全部评论
有没有大佬解释下这题为啥要去重,想不通。筛选以后不是没有重复的了吗?
1 回复 分享
发布于 04-17 21:45 北京
秀,通过group by代替distinct
1 回复 分享
发布于 2023-10-03 22:15 江苏
group by为什么跟music_id正确,跟music_name就错误呢?
点赞 回复 分享
发布于 04-04 00:55 四川
select后面不是要跟group by后面的列吗,为什么这个能运行呢
点赞 回复 分享
发布于 2024-11-09 18:04 河南
确实是好思路
点赞 回复 分享
发布于 2024-11-04 09:08 山西
执行顺序:from—where—group by—having—select—order by—limit
点赞 回复 分享
发布于 2023-12-01 15:17 上海

相关推荐

给我发了笔试链接,想着等晚上回去做,结果还没做流程就终止了
伟大的小黄鸭在学习:我猜就是笔试几乎没用,就是用来给用人部门拖时间复筛简历的,可能用人部门筛到你简历觉得不合适就提前挂了
投递小鹏汽车等公司10个岗位
点赞 评论 收藏
分享
评论
59
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务