• mysql查询每个用户最新的一条订单


    表结构: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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    子查询:根据用户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
    
    • 1
    • 2
    • 3

    这样查询其实有问题,如用户有两个订单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分组,然后取列表的第一个,我想是没太大问题的,毕竟最新的有多个(创建时间相同),它们都是最新的,从业务上取哪一个都没问题。

  • 相关阅读:
    搭建环境AI画图stable-diffusion
    Redis篇---第一篇
    linux下部署darknet
    实体对齐(二):BERT-INT
    SfM——八点法计算F矩阵(基础矩阵)与三角测量
    洛谷 P2852 [USACO06DEC]Milk Patterns G(后缀数组,height数组)
    C/C++逻辑与运算与汇编指令的关系
    栈与队列2:用队列实现栈
    跨境电商系统商城源码定制开发的优势与需求
    链表反转类算法题
  • 原文地址:https://blog.csdn.net/ibigboy/article/details/126723356