文件: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
來明確地表示連線操作。這樣,查詢的意圖就更加清晰了。