力扣597(MySQL)-好友申请Ⅰ:总体通过率(简单)

发布时间 2023-03-30 11:29:58作者: 我不想一直当菜鸟

题目:

 此表没有主键,它可能包含重复项。
该表包含发送请求的用户的 ID ,接受请求的用户的 ID 以及请求的日期。

此表没有主键,它可能包含重复项。
该表包含发送请求的用户的 ID ,接受请求的用户的 ID 以及请求通过的日期。

问题
写一个查询语句,求出好友申请的通过率,用 2 位小数表示。通过率由接受好友申请的数目除以申请总数。

提示:

通过的好友申请不一定都在表 friend_request 中。你只需要统计总的被通过的申请数(不管它们在不在表 FriendRequest 中),并将它除以申请总数,得到通过率
一个好友申请发送者有可能会给接受者发几条好友申请,也有可能一个好友申请会被通过好几次。这种情况下,重复的好友申请只统计一次。
如果一个好友申请都没有,你应该返回 accept_rate 为 0.00 。

示例
输入:

 

  

解释:
总共有 5 个请求,有 4 个不同的通过请求,所以通过率是 0.80

 解题思路:

①先用两个子查询从两个表中查询出总共请求个数和通过请求个数,可以使用distinct 加两个字段来筛选出多个不同的值;

②使用ifnull(expr1,expr2)来解决--如果一个好友申请都没有,你应该返回 accept_rate 为 0.00 ;

③使用round(express,2)来解决---求出好友申请的通过率,用 2 位小数表示。

1 SELECT
2     ROUND( 
3       IFNULL(
4          ( SELECT count( DISTINCT requester_id, accepter_id ) FROM RequestAccepted_597 ) 
5         / 
6         ( SELECT count( DISTINCT sender_id, send_to_id ) FROM FriendRequest_597 ) 
7         ,0)
8     , 2)
9  AS temp;

小知识:

①IFNULL用法:

IFNULL(expr1,expr2),如果expr1的值为null,则返回expr2的值,如果expr1的值不为null,则返回expr1的值。

②round(x,d) ,x指要处理的数,d是指保留几位小数

这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0;

-- 结果为1100
select round(1123.26723,-2);
-- 结果为1120
select round(1123.26723,-1);
-- 结果为1123.27
select round(1123.26723,2);