You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制左连接结果(取单客户最新订单评价)并用于后续左连接

解决每个客户关联最新订单评价的SQL查询问题

问题描述

需要关联三个实体并执行两次左连接:第一次左连接时,每个客户仅保留其最新的订单评价,之后再连接另一张依赖客户和订单评价的表并设置筛选条件。原查询只能全局选出一条订单评价,无法实现“每个客户各一条最新评价”的需求,尝试过的其他写法均未生效。

原错误查询:

SELECT * FROM customer 
left join (SELECT * FROM orderevaluation ORDER BY createstamp desc LIMIT 1) o on customer.id = o.customer_id
left join ... WHERE ... AND ... ;

解决方案

根据数据库版本或字段限制,提供两种可行写法:

方法1:使用开窗函数(适配MySQL 8+/PostgreSQL/SQL Server等主流数据库)

通过ROW_NUMBER()开窗函数按客户分组,每组内按创建时间倒序取第一条(即最新评价):

SELECT * 
FROM customer 
LEFT JOIN (
    SELECT *,
           -- 按客户分组,组内按创建时间倒序编号,最新评价的编号为1
           ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY createstamp DESC) AS rn
    FROM orderevaluation
) o ON customer.id = o.customer_id AND o.rn = 1
LEFT JOIN your_second_table -- 替换为你的第二个关联表
    ON -- 替换为你的第二个连接条件
WHERE -- 替换为你的筛选条件

方法2:利用自增ID分组(适用于仅能使用id字段的场景)

如果orderevaluation表的id是自增主键,最新评价的id必然最大,可通过分组取最大id来获取最新评价:

SELECT * 
FROM customer 
LEFT JOIN (
    SELECT oe.*
    FROM orderevaluation oe
    INNER JOIN (
        -- 先筛选出每个客户的最新评价ID
        SELECT customer_id, MAX(id) AS latest_oe_id
        FROM orderevaluation
        GROUP BY customer_id
    ) latest_oe ON oe.id = latest_oe.latest_oe_id
) o ON customer.id = o.customer_id
LEFT JOIN your_second_table -- 替换为你的第二个关联表
    ON -- 替换为你的第二个连接条件
WHERE -- 替换为你的筛选条件

关键说明

  • 原查询的核心问题:子查询是全局取最新一条评价,而非按客户分组取最新,导致所有客户关联同一条评价。
  • 两种方法均先确保每个客户仅关联其最新订单评价,再执行后续的左连接和条件筛选。

内容的提问来源于stack exchange,提问作者newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:55:30