文档:https://www.runoob.com/mysql/mysql-join.html


之前的分页优化写法(推荐使用 INNER JOIN )

select t1.orderId, t1.venderId, t1.created, t1.modified, t1.pushCreated, t1.pushModified, t1.responseJson
        from yd_pop_order t1,
        (select orderId from yd_pop_order where venderId = #{venderId} and pushModified between #{startJdpModifyTime} and #{endJdpModifyTime} order by pushModified limit #{offset},#{pageSize}) t2
        where t1.orderId = t2.orderId 这种语法 是 MySQL的 什么语法

你提供的查询使用了MySQL的子查询(也称为内查询或嵌套查询)和连接(JOIN)操作,但它并没有显式地使用JOIN关键字,而是使用了老式的、基于逗号分隔的表列表和WHERE子句来进行连接。这种语法在MySQL中是合法的,但通常建议使用更现代的JOIN语法,因为它更清晰、更易于阅读和维护。

这里是你的查询的解析:

  1. 子查询 (t2):

    (select orderId 
     from yd_pop_order 
     where venderId = #{venderId} 
       and pushModified between #{startJdpModifyTime} and #{endJdpModifyTime} 
     order by pushModified 
     limit #{offset},#{pageSize}) t2
    

    这个子查询从yd_pop_order表中选择了满足特定条件的orderId。它过滤了venderId匹配给定值,并且pushModified在指定时间范围内的记录。然后,它按照pushModified排序,并使用LIMIT子句来限制结果集的大小,实现分页。

  2. 主查询:

    select t1.orderId, t1.venderId, t1.created, t1.modified, t1.pushCreated, t1.pushModified, t1.responseJson
    from yd_pop_order t1, ...
    where t1.orderId = t2.orderId
    

    主查询从yd_pop_order表中选择了一系列列,并且与子查询的结果进行了连接。连接条件是t1.orderId = t2.orderId,这意味着它只选择那些在主表中其orderId也出现在子查询结果中的记录。

  3. 连接(JOIN):
    尽管这个查询没有使用JOIN关键字,但它实际上执行了一个连接操作。在MySQL中,你可以通过逗号分隔表名并在WHERE子句中指定连接条件来实现连接。这种语法是合法的,但通常推荐使用INNER JOINLEFT JOIN等关键字来明确连接的类型,因为这样做更清晰。

为了使用更现代的语法,你可以将查询重写为:

SELECT t1.orderId, t1.venderId, t1.created, t1.modified, t1.pushCreated, t1.pushModified, t1.responseJson
FROM yd_pop_order t1
INNER JOIN (
    SELECT orderId 
    FROM yd_pop_order 
    WHERE venderId = #{venderId} 
      AND pushModified BETWEEN #{startJdpModifyTime} AND #{endJdpModifyTime} 
    ORDER BY pushModified 
    LIMIT #{offset}, #{pageSize}
) t2 ON t1.orderId = t2.orderId;

在这个重写中,我使用了INNER JOIN来明确地表示连接操作。这样,查询的意图就更加清晰了。

image

image

posted on 2024-11-04 10:52  del88  阅读(3)  评论(0编辑  收藏  举报