最近做了京东的24年春招题,题目如下:
题目分析
在这道题目中,我们需要从两个表中提取数据:user_info
和 order_log
。以下是每个表的结构及字段的汉语意思:
-
user_info(用户信息表)
uid
:用户IDchannel
:用户渠道
-
order_log(订单日志表)
uid
:用户ID
目标:找出没有下过订单的用户中,人数最多的渠道。
输出要求:输出人数最多的渠道及其人数,按人数降序排列,如果人数相同则按渠道名称升序排列,最终只输出一条记录。
知识点关键词:子查询、NOT IN
、分组、排序、限制输出
解答步骤
-
子查询
首先,我们需要找出所有下过订单的用户ID。可以通过从
order_log
表中选择uid
来实现。select uid from order_log
-
主查询
在主查询中,我们从
user_info
表中选择所有用户,并使用NOT IN
子查询来排除那些已经下过订单的用户。然后使用COUNT(*)
函数来计算每个渠道中没有下过订单的用户数量。select channel, count(*) as cnt from user_info where uid not in (select uid from order_log)
-
分组和排序
使用
GROUP BY
语句按渠道分组,以便计算每个渠道的用户数量。然后使用ORDER BY
语句按人数降序排列结果,如果人数相同则按渠道名称升序排列。group by channel order by cnt desc, channel
-
限制输出
使用
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
、计数
- 知识点:分组、聚合函数、排序
- 知识点:分组、聚合函数、排序、限制输出