MST

星途 面试题库

面试题:MySQL多表联合复杂WHERE子句优化查询

存在三张表,`products`表(`product_id`,`product_name`,`category_id`,`price`),`categories`表(`category_id`,`category_name`),`orders`表(`order_id`,`product_id`,`order_date`,`quantity`)。需求是查询出2022年第四季度每个类别中销量最高的产品名称及其销量,并按照类别名称排序。写出优化后的SQL查询语句,并且说明优化思路。
23.1万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试
WITH RankedSales AS (
    SELECT 
        p.product_name,
        c.category_name,
        SUM(o.quantity) AS total_sales,
        ROW_NUMBER() OVER (PARTITION BY c.category_name ORDER BY SUM(o.quantity) DESC) AS sales_rank
    FROM 
        products p
    JOIN 
        categories c ON p.category_id = c.category_id
    JOIN 
        orders o ON p.product_id = o.product_id
    WHERE 
        o.order_date >= '2022-10-01' AND o.order_date <= '2022-12-31'
    GROUP BY 
        p.product_name, c.category_name
)
SELECT 
    category_name,
    product_name,
    total_sales
FROM 
    RankedSales
WHERE 
    sales_rank = 1
ORDER BY 
    category_name;

优化思路

  1. 使用CTE(Common Table Expression):通过CTE RankedSales计算每个产品在其所属类别中的销量排名,使得查询逻辑更加清晰。
  2. 窗口函数:在CTE中使用ROW_NUMBER()窗口函数,按照每个类别的总销量进行降序排列,并给每个产品在其类别内分配一个排名。这样可以方便地筛选出每个类别中销量最高的产品。
  3. JOIN操作:通过JOIN操作将products表、categories表和orders表关联起来,确保数据的完整性。
  4. WHERE条件:通过WHERE条件筛选出2022年第四季度的订单数据,减少不必要的数据处理。
  5. 最终筛选和排序:在主查询中,只选择排名为1的产品(即每个类别中销量最高的产品),并按照类别名称排序。