感觉时间好像过得很慢,觉得自己做了好久的题目呀,但今天居然才第七天!不过~坚持真的会很有成就感的!有点想喝茶颜悦色了,也想出去玩,想再江边散步,看夕阳西下。
结束碎碎念,一起来看看今天有什么题目吧~
闯关开始!
关卡1 - 好友申请 II :谁有最多的好友
思路:
由于好友是双向的,所以如果一个人接受了另一个人的请求,他们两个都会多拥有一个朋友。
因为是交叉记录的,所以要建一个子表将requester_id,accepter_id换位置,续在原表后面,用union函数
所以,我们将 requester_id 和 accepter_id 联合起来,然后统计每个人出现的次数。
这里我们应该使用 union all 而不是 union ,因为 union all 即使遇到重复的记录也都会保存下来。
我们的思路是,在一个联合的表格里,我们去group by id,然后统计次数。
select requester_id as id, count(requester_id) as num from
(
(select requester_id from request_accepted)
union all
(select accepter_id from request_accepted)
) as newtable
group by requester_id
order by num desc
limit 1
恭喜过关!进入下一关!
关卡2 - 连续空余座位
思路:
这道题显而易见我们需要创建连接表,我一开始连了三张表,但发现下面这种方法更加简便,就是abs(b-a)=1,然后,连接之后,我们要让a 和 b 都是等于1的.
当3,4,5的时候,4和3,4和5同时满足这三个条件,所以4会返回两回。所以我们还要在一开始加distinct
select distinct a.seat_id from cinema a, cinema b
where abs(b.seat_id - a.seat_id) = 1
and a.free = 1
and b.free = 1
order by a.seat_id asc
恭喜过关!进入下一关!
关卡3 - 销售员
思路:
一开始想的是三表连接,但是用in关键字更容易理解。
我们让sales_id not in 剩下两个连接好的表,然后限制条件为name like 'RED'
就可以啦!是不是特别容易理解~
select s.name from salesperson s
where s.sales_id not in(
select sales_id from orders o
left join company c
on o.com_id = c.com_id
where c.name like 'RED'
)
恭喜过关!进入下一关!
关卡4 - 树节点
思路:
我们可以按照下面的定义,求出每一条记录的节点类型。
Root: 没有父节点
Inner: 它是某些节点的父节点,且有非空的父节点
Leaf: 除了上述两种情况以外的节点
所以我们可以用case when来写这道题
case when的语法是:
语法1:
语法2:
所以这道题就是:
select id,
case when t.p_id is null then 'Root'
when t.id in (select p_id from tree) then 'Inner'
else 'Leaf'
end as type
from tree t
恭喜过关!进入下一关!
关卡5 - 判断三角形
思路:
三角形任意两边之和大于第三边,任意两边之差小于第三边。
所以我们正好复习上面说的case when,来实现上述条件。
select x, y, z,(case
when x + y > z and x + z > y and z + y > x then 'Yes'
else 'No'
end) as triangle
from triangle
恭喜过关!
今天学到的新知识: union all 即使遇到重复的记录也都会保存下来;要判断连续三个的情况可以用abs(b-a)=1;三表连接也可以用一个表not in/in 另外两个表的链接来做;case when是在select语句里的判断语句,最后记得加end。
明天继续闯关~yay ~