题目:

假设有一个 MySQL 数据库中有两张表,分别为 users 和 orders,表结构如下:

users 表:

| id | name | age | gender | |----|------|-----|--------| | 1 | Tom | 20 | M | | 2 | Jack | 25 | M | | 3 | Lily | 22 | F |

orders 表:

| id | user_id | order_time | |----|---------|------------| | 1 | 1 | 2021-01-01 | | 2 | 1 | 2021-02-01 | | 3 | 2 | 2021-03-01 | | 4 | 3 | 2021-03-01 | | 5 | 3 | 2021-04-01 |

请编写一条 SQL 查询语句,统计每个用户的订单数量和最近一次订单时间,并按照订单数量从大到小排序。要求查询结果包含以下列:

| name | order_count | latest_order_time | |------|-------------|------------------| | Tom | 2 | 2021-02-01 | | Lily | 2 | 2021-04-01 | | Jack | 1 | 2021-03-01 |

答案:

SELECT u.name, COUNT(o.id) AS order_count, MAX(o.order_time) AS latest_order_time
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id
GROUP BY u.id
ORDER BY order_count DESC

解析:

此题考查了 SQL 基础知识以及联表查询的能力。首先需要使用 LEFT JOIN 将 users 和 orders 表联接起来,然后使用 COUNT 函数统计每个用户的订单数量,使用 MAX 函数统计每个用户的最近一次订单时间。最后按照订单数量降序排序即可。

需要注意的是,需要使用 GROUP BY 对每个用户进行分组,否则查询结果会出现重复。同时,由于 orders 表中可能存在没有订单的用户,因此需要使用 LEFT JOIN 保证查询结果中包含所有用户,即使他们没有订单。

你作为数据开发岗位的面试官我作为中级数据开发工程师请出一道原创的笔试题并给出详细答案要求问题为原创难度中等请使用中文回答。

原文地址: https://www.cveoy.top/t/topic/1rj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录