最近做了京东的24年春招题,题目如下: alt

题目分析

在这道题目中,我们需要从两个表中提取数据:user_infoorder_log。以下是每个表的结构及字段的汉语意思:

  1. user_info(用户信息表)

    • uid:用户ID
    • channel:用户渠道
  2. order_log(订单日志表)

    • uid:用户ID

目标:找出没有下过订单的用户中,人数最多的渠道。

输出要求:输出人数最多的渠道及其人数,按人数降序排列,如果人数相同则按渠道名称升序排列,最终只输出一条记录。

知识点关键词:子查询、NOT IN、分组、排序、限制输出

解答步骤

  1. 子查询

    首先,我们需要找出所有下过订单的用户ID。可以通过从 order_log 表中选择 uid 来实现。

    select uid from order_log
    
  2. 主查询

    在主查询中,我们从 user_info 表中选择所有用户,并使用 NOT IN 子查询来排除那些已经下过订单的用户。然后使用 COUNT(*) 函数来计算每个渠道中没有下过订单的用户数量。

    select channel,
    count(*) as cnt
    from user_info
    where uid not in (select uid from order_log)
    
  3. 分组和排序

    使用 GROUP BY 语句按渠道分组,以便计算每个渠道的用户数量。然后使用 ORDER BY 语句按人数降序排列结果,如果人数相同则按渠道名称升序排列。

    group by channel
    order by cnt desc, channel
    
  4. 限制输出

    使用 LIMIT 语句限制输出结果为一条记录,即人数最多的渠道。

    limit 1
    

完整代码

select channel,
count(*) as cnt
from user_info
where uid not in (select uid from order_log)
group by channel
order by cnt desc, channel
limit 1

近似题目练习推荐

未下单用户统计

  • 知识点:子查询、NOT IN、计数

下单最多的商品

  • 知识点:分组、聚合函数、排序

用户购买次数前三

  • 知识点:分组、聚合函数、排序、限制输出