力扣day07

602. 好友申请 II :谁有最多的好友

SELECT id, COUNT(*) AS num
FROM (
    SELECT requester_id AS id FROM RequestAccepted
    UNION ALL
    SELECT accepter_id AS id FROM RequestAccepted
) AS combined
GROUP BY id
ORDER BY num DESC
LIMIT 1;

注意:这里我们应该使用 union all 而不是 union ,因为 union all 即使遇到重复的记录也都会保存下来。 拿样例举例,输出应该是: ids 1 1 2 3 2 3 3 4

  1. 原始数据表

    复制

    下载

    +--------------+-------------+------------+
    | requester_id | accepter_id | accept_date|
    +--------------+-------------+------------+
    | 1            | 2           | 2023-01-01 |
    | 1            | 3           | 2023-01-02 |
    | 2            | 3           | 2023-01-03 |
    +--------------+-------------+------------+
  2. 合并阶段(UNION ALL):

    复制

    下载

    +----+
    | id |
    +----+
    | 1  | ← requester_id
    | 1  |
    | 2  |
    | 2  | ← accepter_id
    | 3  |
    | 3  |
    +----+
  3. 分组统计(GROUP BY + COUNT):

    复制

    下载

    +----+-----+
    | id | num |
    +----+-----+
    | 1  | 2   | ← 1号用户作为请求者出现2次
    | 2  | 2   | ← 2号用户作为请求者1次 + 接受者1次
    | 3  | 2   | ← 3号用户作为接受者出现2次
    +----+-----+
  4. 排序取最大值(ORDER BY + LIMIT 1):

    复制

    下载

    +----+-----+
    | id | num |
    +----+-----+
    | 1  | 3   | ← 最终结果(假设统计后1号用户最多)
    +----+-----+

关键点

  • UNION ALL 合并请求者和接受者的所有 ID(包含重复)

  • GROUP BY + COUNT 计算每个用户的总好友数

  • ORDER BY + LIMIT 找到唯一的最大值

607. 销售员

  • SELECT name
    
    FROM SalesPerson
    
    WHERE sales_id NOT IN (
    
    SELECT DISTINCT o.sales_id
    
    FROM Orders o
    
    JOIN Company c ON o.com_id = c.com_id
    
    WHERE c.name = 'RED'
    
    )

  • 子查询SELECT DISTINCT o.sales_id FROM Orders o JOIN Company c ON o.com_id = c.com_id WHERE c.name = 'RED'

    • 通过 JOIN 连接 Orders 和 Company 表,筛选出公司名为“RED”的订单。

    • DISTINCT 确保每个销售人员ID只出现一次,避免重复。

  • 主查询SELECT s.name FROM SalesPerson s WHERE s.sales_id NOT IN (...)

    • 从 SalesPerson 表中选择不在子查询结果中的销售人员,即未参与“RED”公司订单的销售人员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值