基于Order、Customer、Address表的Flexible Search查询需求
解决方案:获取所有注册客户及最新订单信息
嘿,我来帮你搞定这个需求!首先咱们先明确下三张表的常规关联逻辑(如果你的表结构略有不同,可以稍作调整):
Customer表:存储客户核心信息,包含主键ID、Customer_Name、Email,以及关联地址表的外键AddressIDAddress表:存储客户地址信息,包含主键ID、Country、PhoneOrder表:存储订单信息,包含Order_Code(订单编码)、关联客户的外键CustomerID,还有Order_Date(用来判断最新订单,要是没有这个字段,用自增的订单ID也可以)
实现SQL(兼容多数主流数据库)
SELECT c.Customer_Name, c.Email, c.ID, a.Country, a.Phone, o.Latest_Order_Code FROM Customer c -- 关联地址表获取客户的国家、电话信息 LEFT JOIN Address a ON c.AddressID = a.ID -- 子查询获取每个客户的最新订单编码 LEFT JOIN ( SELECT CustomerID, Order_Code AS Latest_Order_Code, -- 按客户分组,订单时间倒序排序,标记每条订单的序号 ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY Order_Date DESC) AS rn FROM `Order` -- 注意:Order是SQL关键字,多数数据库需要用反引号/方括号转义,比如SQL Server用[Order] ) o ON c.ID = o.CustomerID AND o.rn = 1; -- 只取每个客户的第一条(最新)订单
关键逻辑说明
- 确保返回所有注册客户:用
Customer作为主表,搭配LEFT JOIN,哪怕客户没有地址或订单,也会被包含在结果里 - 获取最新订单:用窗口函数
ROW_NUMBER()按客户分组,对订单按时间倒序排序,只保留每组的第一条记录(也就是最新的订单),再通过LEFT JOIN关联到主查询,没有订单的客户对应的Latest_Order_Code会自动显示为NULL(也就是你要的留空效果) - 适配无订单时间的场景:如果你的
Order表没有Order_Date字段,只要订单ID是自增的,把子查询里的ORDER BY Order_Date DESC改成ORDER BY ID DESC就行,同样能拿到最新订单
内容的提问来源于stack exchange,提问作者User2413
相关产品推荐
相关产品推荐

