表结构:id,user_id,order_status,create_time,update_time…
子查询加表连接查询:
select b.* FROM (
SELECT max(create_time) as create_time,user_id
FROM order_record
WHERE order_status = 2 group by user_id) a
LEFT JOIN order_record b
ON a.user_id= b.user_idand a.create_time= b.create_time;
子查询:根据用户id分组查询出创建时间最新的那个订单的create_time和用户id
表连接:将子查询的临时表和原表order_record左连接,连接条件是子查询的查询结果字段
根据自身业务可以调整子查询的查询结果列,我这里是按最新的create_time,如果id是自增的也可以用max(id),相应调整表连接的条件即可。
子查询的查询结果为什么不直接把id查出来?
如下:
SELECT max(create_time) as create_time,id
FROM order_record
WHERE order_status = 2 group by user_id
这样查询其实有问题,如用户有两个订单id分别为1、2,第一个创建时间是2022-9-6 10:49:07,第二个创建时间是2022-9-6 13:49:18,此时查询结果是【create_time:2022-9-6 13:49:18 , id:1】。可以发现不是我们预期的,所以这样查是不准确的。
所以采用子查询加表连接的方式,前提是表连接后每个用户的查询的结果是唯一的。
例如,上述使用最大的创建时间,那么如果创建时间最大且相同的有多个,连接后的查询结果就会有多个。但是这样也不会有太大的问题,可以在代码里根据用户id分组,然后取列表的第一个,我想是没太大问题的,毕竟最新的有多个(创建时间相同),它们都是最新的,从业务上取哪一个都没问题。