如何限制左连接结果(取单客户最新订单评价)并用于后续左连接
解决每个客户关联最新订单评价的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
相关产品推荐
相关产品推荐

