mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線

del88發表於2024-11-04

文件: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

相關文章