加入兩個表以獲得單個組合結果集
tl;博士我在這裡http://sqlfiddle.com/#!9/031e71/1做了一個 SQLFiddle,帶有一個最小的、完整的、可重現的測試案例(儘管非常特定於訂單和產品的問題域)。
我在 MariaDB 上有一個 Zen Cart 電子商務系統,但在將訂單資訊提取到下游訂單管理系統的方式上存在問題。我還研究了訂單管理系統中的腳本以修改數據,但似乎他們的 API 不允許在那個階段修改訂單(啊!)所以我正在通過讀取訂單時使用的 SQL 進行嘗試從 MariaDB 到訂單管理系統。
該場景是優惠券已應用於訂單,從而產生折扣,我希望該優惠券的存在與訂單中的產品一起出現在結果集中。因此,如果您購買堅果 $ 100 and apply a $ 10 折扣券,我想要結果集中的兩行,一為 Nuts 在 $ 80 and one for the coupon at $ 10,所以總數等於 $ 90 (the $ 100 的成本減去 10 美元的折扣)。數學不是問題,問題是產品的存在和優惠券的存在在兩個非常不同的表中。
Zen Cart 有三個主要的表:
- 訂單 - 每個訂單一條記錄
- orders_totals - 每個訂單 4 或 5 條記錄,包括總計、小計、增值稅內容、折扣券(這是我的問題的癥結所在)
- orders_products - 每個訂單中每個產品一個記錄。
我想針對orders_totals 和orders_products 加入訂單以獲得每個產品一行,如果orders_totals 中存在一行作為優惠券的訂單,則增加一行。
有沒有優雅的方法來解決這個問題?我不確定一個狡猾的 JOIN 是否足夠,或者是否可能需要一個 View 或 PARTITION。
** 編輯 ** 我做了一個新的小提琴,它採用優惠券金額,將其除以產品數量,然後從每個產品金額中減去該部分,並結合 UNION 建議。請參閱http://sqlfiddle.com/#!9/27ad50/3 .. 但這似乎很醜陋,因為 UNION 前半部分的連接中所有子選擇都在進行,我不敢說這是一個很好的解決方案!
在這種情況下,由於
Coupon
是另一個表的特定條目,我將使用 UNION。作為建議,我會嘗試將 , 的“優惠券”條目轉換
orders_total
為作為另一行添加到orders
表中的另一個產品。SELECT orders_id, products_name as name, cost FROM orders o JOIN orders_products op on o.orders_id = op.fk_orders_id WHERE o.orders_id = 1 UNION SELECT fk_orders_id, name, total as cost FROM orders_totals WHERE fk_orders_id = 1 AND name = 'coupon'
結果:
| orders_id | name | cost | |-----------|--------|------| | 1 | Nuts | 100 | | 1 | coupon | -10 |
sqlfiddle在這裡