`

网易昨天笔试题中一道SQL题,大家进来讨论下!

SQL 
阅读更多
首先,我答得不好,反思一下,基础不牢固。

题目是这样的:

表 User   userid    bigint
          username  varchar

表Message   messageId     bigint
            fromUserid    bigint
            toUserid      bigint
            sendtime      date

这是个发送聊天信息相关的两个表,现写出SQL语句,求出username = ‘TestUser’这个人最近联系的10个人(包括发送的和接受的人


我是没写出来(写了一个,现在想想肯定错了)。

各位看看,该怎么写这个SQL



我的答案;
select userid
  from (
        SELECT userid, max(sendtime)
          FROM (SELECT T2.TOUSERID AS USERID, T2.SENDTIME
                   FROM t_USER T1, t_MESSAGE T2
                  WHERE T1.USERNAME = 'TestUser'
                    AND T1.USERID = T2.FROMUSERID
                 UNION all
                 SELECT T2.FROMUSERID AS USERID, T2.SENDTIME
                   FROM t_USER T1, t_MESSAGE T2
                  WHERE T1.USERNAME = 'TestUser'
                    AND T1.USERID = T2.TOUSERID
                 )
         group by userid
         order by max(sendtime) desc) 
 WHERE ROWNUM <= 10;


这里主要有几个细节:
1、要用UNION all,而不能用UNION。UNION all是全连接,把后面的直接全部加在前面一个的下面。UNION是去掉重复的然后在排序放在一起。
2、UNION中不能使用order by语句。
分享到:
评论
2 楼 grayhound 2010-09-29  
跟你的思路差不多,但是你在做合并的时候,把表的相关数据都取出来了。
这样做挺影响性能的。其实最多合并前的子表,每次只取10条就足矣了。
1 楼 grayhound 2010-09-29  
select t.userid from
(select m1.userid,max(m1.sendtime) from Message m1,User u where m1.fromUserid  =u.userid and u.username='TestUser' and rownum<=10 group by m1.userid order by max(m1.sendtime) desc
union
select m2.userid,max(m2.sendtime) from Message m2,User u where m2.fromUserid  =u.userid and u.username='TestUser  and rownum<=10 group by m1.userid order by max(m2.sendtime) desc) t
where rownum<=10
group by t.userid order by max(t.sendtime) desc

相关推荐

Global site tag (gtag.js) - Google Analytics