[英]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.