LeetCode:Database 26.好友申请 II :谁有最多的好友

要求:写一个查询语句,求出谁拥有最多的好友和他拥有的好友数目。

在 Facebook 或者 Twitter 这样的社交应用中,人们经常会发好友申请也会收到其他人的好友申请。

request_accepted表得结构:

| requester_id | accepter_id | accept_date|
|--------------|-------------|------------|
| 1            | 2           | 2016_06-03 |
| 1            | 3           | 2016-06-08 |
| 2            | 3           | 2016-06-08 |
| 3            | 4           | 2016-06-09 |
表 request_accepted 存储了所有好友申请通过的数据记录,其中, requester_id 和 accepter_id 都是用户的编号。

Result Table:

| id | num |
|----|-----|
| 3  | 3   |

分析:
1.求出每个用户发送申请次数+接受申请的次数即为总好友数

SQL语句:

#1.方法1
WITH a1 AS(
SELECT requester_id AS i1,COUNT(DISTINCT accepter_id) AS r1
FROM
request_accepted
GROUP BY requester_id),
a2 AS(
SELECT accepter_id AS i1,COUNT(DISTINCT requester_id) AS r1
FROM
request_accepted
GROUP BY accepter_id  
)
SELECT id,num
FROM(
SELECT a1.i1 AS id,(a1.r1+a2.r1)AS num
FROM a1,a2
WHERE a1.i1=a2.i1
UNION ALL
SELECT a1.i1 AS id,a1.r1 AS num
FROM a1
WHERE a1.i1 NOT IN(SELECT i1 FROM a2)
UNION ALL
SELECT a2.i1 AS id,a2.r1 AS num
FROM a2
WHERE a2.i1 NOT IN(SELECT i1 FROM a1)
)c1
ORDER BY num DESC
LIMIT 1;
#2.方法2
WITH a1 AS(
SELECT DISTINCT requester_id AS id FROM request_accepted
UNION ALL
SELECT DISTINCT accepter_id AS id FROM  request_accepted
WHERE  accepter_id NOT IN(
SELECT requester_id AS id FROM request_accepted)
)

SELECT id,(c1+c2) AS num FROM (
SELECT a1.id AS id,COUNT(DISTINCT a2.accepter_id)AS c1,COUNT(DISTINCT a3.requester_id)AS c2
FROM a1
LEFT JOIN request_accepted a2
ON a1.id=a2.requester_id
LEFT JOIN request_accepted a3
ON a1.id=a3.accepter_id
GROUP BY a2.requester_id,a3.accepter_id
ORDER BY id)a3
ORDER BY num DESC
LIMIT 1;
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值