簡體   English   中英

在mysql查詢中連接兩次相同的表

[英]joining same table twice in a mysql query

我試圖了解此查詢中連接的目的是什么。

SELECT 
    DISTINCT o.order_id 
FROM 
    `order` o, 
    `order_product` as op 
LEFT JOIN `provider_order_product_status_history` as popsh 
    on op.order_product_id = popsh.order_product_id 
LEFT JOIN  `provider_order_product_status_history` as popsh2 
    ON popsh.order_product_id = popsh2.order_product_id 
        AND popsh.provider_order_product_status_history_id < 
               popsh2.provider_order_product_status_history_id 
WHERE 
    o.order_id = op.order_id 
    AND popsh2.last_updated IS NULL 
LIMIT 10

困擾我的是provider_order_product_status_history已加入2次,我不確定它的用途。 非常感謝有人可以提供幫助

這是一種檢索最新訂單狀態的技術。

因為

AND popsh.provider_order_product_status_history_id < popsh2.provider_order_product_status_history_id

AND popsh2.last_updated IS NULL

僅返回那些沒有任何新狀態的訂單狀態。

有關最小設置示例,請考慮以下狀態歷史記錄表:

id  status order_id last_updated
--------------------------------
1   A      X        1:00
2   B      X        2:00

自我加入將導致:

id  status order_id last_updated    id  status order_id last_updated
--------------------------------    --------------------------------
1   A      X        1:00            2   B      X        2:00
2   B      X        2:00                NULL   NULL     NULL

第一行將被IS NULL條件過濾掉,只留下第二行,即最新的一行。

對於3行案例,自聯接結果將是:

id  status order_id last_updated    id  status order_id last_updated
--------------------------------    --------------------------------
1   A      X        1:00            2   B      X        2:00
1   A      X        1:00            3   C      X        3:00
2   B      X        2:00            3   C      X        3:00
3   C      X        3:00                NULL   NULL     NULL

只有最后一個將通過IS NULL條件,再次保留最新的條件。

它看起來像是一種不必要的復雜方式來完成這項工作,但實際上它非常有效,因為RDBMS引擎可以非常高效地加入。

順便說一下,由於查詢只檢索order_id,因此查詢無效。 我猜OP省略了select子句中的其他字段。 它應該像SELECT o.order_id, popsh.* FROM ...

等等,你有一個錯誤:

SELECT 
    DISTINCT o.order_id 
FROM 
    `order` o, 
    `order_product` as op 
LEFT JOIN `provider_order_product_status_history` as popsh 
    on op.order_product_id = popshs.order_product_id 
  ** YOU HAVE EXCESS 's' HERE     ^
LEFT JOIN  `provider_order_product_status_history` as popsh2 
    ON popsh.order_product_id = popsh2.order_product_id 
        AND popsh.provider_order_product_status_history_id < popsh2.provider_order_product_status_history_id 
WHERE 
    o.order_id = op.order_id 
    AND popsh2.last_updated IS NULL 
LIMIT 10

從我的分析基礎,查詢試圖提取第一o.order_id或第一項 (基於provider_order_product_status_history.provider_order_product_status_history_id了的) provider_order_product_status_history 但是, 此查詢中使用的連接語義不可重復使用。

兩個連接都是條件上的內部限制結果集。 它就像“gimme只有來自表1的值在條件1上的表2中具有相應的行,同時在條件2上的表2中具有行”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM