题目:
此表没有主键,它可能包含重复项。
该表包含发送请求的用户的 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);