论坛首页 招聘求职论坛

某个大公司的sql面试题,自己不太会做有没有童鞋指点一下

浏览 24151 次
精华帖 (0) :: 良好帖 (2) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-08-17  
cy729215495 写道

1.显然用exists效率高
3.select * from user where  exists (
select userid from Article inner join vote on article.articleid
= vote.articleid  where user.id=article.userId  group by userId  having avg(score)>100 and count(*) >=2
)


探讨一下
  我觉得你的exists中的子查询:
select userid
from Article
inner join vote on article.articleid = vote.articleid 
where user.id=article.userId 
group by userId 
having avg(score)>100 and count(*) >=2
有问题,原因如下:
Article 表 inner join vote 表,则把已发表的文章但是未投票的文章所对应的记录过滤掉了,
所以你count(*) 计算以发表的文章数时,会比实际的少。不知是否有考虑到?
0 请登录后投票
   发表时间:2010-08-17  
我是来围观第五个问题的答案的。
0 请登录后投票
   发表时间:2010-08-17  
只说一点,能用左连接做掉的事情,尽量不要去用exists,in之类的
0 请登录后投票
   发表时间:2010-08-17  
mercyblitz 写道
楼主喜欢用子查询哦,利用外连接速度会更好!


huzhenyu 写道
只说一点,能用左连接做掉的事情,尽量不要去用exists,in之类的

谢谢,确实~
0 请登录后投票
   发表时间:2010-08-17  
lkj107 写道
第一个,俺会用外连接,然后 is null

exists的性能比外连接更好,曾用过做数十万数据量的查询,exists大概比外连接快30%左右
0 请登录后投票
   发表时间:2010-08-17  
baidu的笔试题目
0 请登录后投票
   发表时间:2010-08-17  
第五题呢?
0 请登录后投票
   发表时间:2010-08-17  
niwei 写道
第五题呢?



1000W 用户,使用100w作为一个表,users_1,...users_10。

类似文章表类似。
0 请登录后投票
   发表时间:2010-08-17  
对于第三题,大家都忽略了排序,我的答案如下:
select u.userName from User u inner join
(select userId, avg(score)
   from Article a
   inner join Vote v on a.articleId=v.articleId
   group by a.userId
   having count(articleId)>5 and avg(score)>100) t on t.userId=u.userId
order by t.avgCount
0 请登录后投票
   发表时间:2010-08-17  
对于第三题,大家都忽略了排序,我的答案如下:
select u.userName from User u inner join
(select userId, avg(score) avgCount
   from Article a
   inner join Vote v on a.articleId=v.articleId
   group by a.userId
   having count(articleId)>5 and avg(score)>100) t on t.userId=u.userId
order by t.avgCount
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics