题解 | #更新用户积分信息?#
更新用户积分信息?
https://www.nowcoder.com/practice/ef1f2fda4338460b948810f3f7e7a68e
这道题目要求我们更新用户的积分信息,我们要做的事情如下:
1. 确定总体问题
我们需要根据订单数据更新用户的积分。用户在订单金额大于100时,可以获得与订单金额相同的积分。我们需要从订单信息和用户会员等级信息中提取数据,计算每个用户的总积分,并按积分降序排序。
2. 分析关键问题
- 筛选有效订单:从
order_tb
中筛选出订单金额大于100的订单。 - 连接表:将筛选出的订单与
uservip_tb
表连接,以便获取每个用户的积分信息。 - 计算总积分:将用户的原始积分与有效订单的积分相加,计算每个用户的总积分。
- 过滤无效用户:只输出有有效订单的用户。
- 排序输出:按总积分降序排序。
3. 解决每个关键问题的代码及讲解
步骤1:筛选有效订单
我们使用子查询从order_tb
中筛选出订单金额大于100的订单:
LEFT JOIN (
SELECT
user_id,
order_price
FROM
order_tb
WHERE
order_price > 100
) o ON u.user_id = o.user_id
WHERE order_price > 100
:筛选出订单金额大于100的订单。
步骤2:连接表
将筛选出的订单与uservip_tb
表连接:
FROM
uservip_tb u
LEFT JOIN (
-- 子查询
) o ON u.user_id = o.user_id
LEFT JOIN
:确保即使某个用户没有符合条件的订单,用户信息也能显示。
步骤3:计算总积分
将用户的原始积分与有效订单的积分相加,计算每个用户的总积分:
u.point + SUM(o.order_price) AS point
SUM(o.order_price)
:计算每个用户的有效订单总金额。u.point + ...
:将用户的原始积分与有效订单的积分相加。
步骤4:过滤无效用户
只输出有有效订单的用户:
HAVING
SUM(o.order_price) > 0
HAVING SUM(o.order_price) > 0
:过滤掉没有有效订单的用户。
步骤5:排序输出
按总积分降序排序输出结果:
ORDER BY
point DESC
完整代码
SELECT
u.user_id,
u.point + SUM(o.order_price) AS point
FROM
uservip_tb u
LEFT JOIN (
SELECT
user_id,
order_price
FROM
order_tb
WHERE
order_price > 100
) o ON u.user_id = o.user_id
GROUP BY
u.user_id
HAVING
SUM(o.order_price) > 0
ORDER BY
point DESC;