文档: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
语法,因为它更清晰、更易于阅读和维护。
这里是你的查询的解析:
-
子查询 (
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
子句来限制结果集的大小,实现分页。 -
主查询:
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
也出现在子查询结果中的记录。 -
连接(JOIN):
尽管这个查询没有使用JOIN
关键字,但它实际上执行了一个连接操作。在MySQL中,你可以通过逗号分隔表名并在WHERE
子句中指定连接条件来实现连接。这种语法是合法的,但通常推荐使用INNER JOIN
、LEFT 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
来明确地表示连接操作。这样,查询的意图就更加清晰了。
本文来自博客园,作者:del88,转载请注明原文链接:https://www.cnblogs.com/del88/p/18524715