共計 6025 個字符,預計需要花費 16 分鐘才能閱讀完成。
本文丸趣 TV 小編為大家詳細介紹“MySQL 派生表聯表查詢的方法是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“MySQL 派生表聯表查詢的方法是什么”文章能幫助大家解決疑惑,下面跟著丸趣 TV 小編的思路慢慢深入,一起來學習新知識吧。
前情提要:
公司運營的一個商城系統,忽然發現訂單提現功能有問題,有大量的商戶體現金額和訂單金額不一致。于是產生了需求,需要把提現表和供應商表作為一個結果集,連接上訂單表中的訂單金額,通過計算訂單表的金額和體現表商戶提現的金額進行比對,查看商戶是多提現了還是少提現了。
下面記錄我的查詢過程。
查詢過程:
剛開始,第一步我以提現表為主表,查詢出來相關結果。MySQL 語句如下
SELECT count(ysw.supply_id) AS 提現次數 ,ysw.user_id AS 供應商對應的用戶 ID , ysw.supply_id AS 供應商 ID ,SUM(ysw.money) AS 供應商提現總金額 ,
case ysw.pay_type when 10 then 微信 when 20 then 支付寶 else 銀行卡 end as 支付方式 ,
ys.supply_name AS 供應商名稱 ,ys.money AS 供應商余額 ,ys.freez_money AS 供應商凍結金額(已提現金額)FROM yoshop_supply_withdraw AS ysw LEFT JOIN yoshop_supply AS ys ON ysw.supply_id = ys.supply_id
WHERE ysw.create_time 1647446400 AND ysw.apply_status IN (10,20,40) GROUP BY ysw.supply_id
ORDER BY SUM(ysw.money) DESC ;
查詢結果如圖是正常的:
接下來,我在左鏈接上訂單表的數據,又添加一個了 left join,金額相關數據發生了變化嚴重不一致, 而且查詢時間明顯延長,MySQL 語句如下
SELECT count(ysw.supply_id) AS 提現次數 ,ysw.user_id AS 供應商對應的用戶 ID , ysw.supply_id AS 供應商 ID ,SUM(ysw.money) AS 供應商提現總金額 ,
case ysw.pay_type when 10 then 微信 when 20 then 支付寶 else 銀行卡 end as 支付方式 ,
ys.supply_name AS 供應商名稱 ,ys.money AS 供應商余額 ,ys.freez_money AS 供應商凍結金額(已提現金額),SUM(yo.pay_price)
FROM yoshop_supply_withdraw AS ysw LEFT JOIN yoshop_supply AS ys ON ysw.supply_id = ys.supply_id
LEFT JOIN yoshop_order AS yo ON yo.supply_ids =ysw.supply_id
WHERE ysw.create_time 1647446400 AND ysw.apply_status IN (10,20,40) GROUP BY ysw.supply_id
ORDER BY SUM(ysw.money) DESC ;
查詢結果對比圖如下:
經過實踐,我想直接通過左連接查詢到提現表金額和訂單表金額是行不通的。通過網上查資料,以及在技術群里請教,
優化了思路:把提現的統計好, 把訂單的統計好,最后兩個結果集再根據供應商 id 做個鏈接
接下來就是,三步走了,第一步:把提現的統計好,上面第一次嘗試的第一步就是了,第二步:把訂單表的數據統計好。由于使用系統的原因,我直接使用的訂單商品表計算的訂單總金額,這一步也是分三步走的,我直接上代碼:
1. 查詢 yoshop_order 所有進行中,已完成的 訂單 id(order_id);
SELECT order_id FROM yoshop_order WHERE order_status IN (10,30);
2. 查詢沒有退款的訂單 ID
SELECT order_id FROM yoshop_order WHERE order_status IN (10,30) AND order_id NOT IN ( SELECT order_id FROM yoshop_order_refund);
3. 查詢訂單商品表中 所有的訂單金額
SELECT supply_id AS 供應商 ID , SUM(total_pay_price) AS 供應商訂單總金額 FROM yoshop_order_goods WHERE create_time 1647446400 AND order_pay_status = 0 AND order_id IN(SELECT order_id FROM yoshop_order WHERE order_status IN (10,30) AND order_id NOT IN ( SELECT order_id FROM yoshop_order_refund) ) GROUP BY supply_id
ORDER BY SUM(total_pay_price) DESC ;
接下來就是進行把第一步和第二步的查詢結果當作派生表,進行左連接查詢。我在這一步耗費的時間和精力最多。如果你能認真看完,相信一定會有收貨。我在這里把我錯誤的過程也進行了記錄 第一次錯誤拼接:
SELECT * FROM (SELECT count(ysw.supply_id) AS 提現次數 ,ysw.user_id AS 供應商對應的用戶 ID , ysw.supply_id AS supply_id ,SUM(ysw.money) AS 供應商提現總金額 ,
case ysw.pay_type when 10 then 微信 when 20 then 支付寶 else 銀行卡 end as 支付方式 ,
ys.supply_name AS 供應商名稱 ,ys.money AS 供應商余額 ,ys.freez_money AS 供應商凍結金額(已提現金額)FROM yoshop_supply_withdraw AS ysw LEFT JOIN yoshop_supply AS ys ON ysw.supply_id = ys.supply_id
WHERE ysw.create_time 1647446400 AND ysw.apply_status IN (10,20,40) GROUP BY ysw.supply_id
ORDER BY SUM(ysw.money) DESC ) AS t1
union all // left join , 這里是注釋記得刪除
SELECT * FROM -- 這里是錯誤的不應該在查詢
(SELECT supply_id AS supply_id , SUM(total_pay_price) AS total_pay_price FROM yoshop_order_goods WHERE create_time 1647446400 AND order_pay_status = 0 AND order_id IN(SELECT order_id FROM yoshop_order WHERE order_status IN (10,30) AND order_id NOT IN (SELECT order_id FROM yoshop_order_refund) ) GROUP BY supply_id
ORDER BY SUM(total_pay_price) DESC ) AS t2
ON t1.suppply_id = t2.suppply_id
通過這一次試錯,明顯看出我把 left join 和 union all 的含義記錯了, 并且在拼接的時候重復使用了 select * from。雖然是試錯了,但也是有收貨的,接下來進行了第二次錯誤的拼接:
SELECT t1. 提現次數 ,t1. 供應商對應的用戶 ID ,t1.supply_id, t1. 支付方式 ,t1. 供應商名稱,t1. 供應商余額, t1. 供應商凍結金額(已提現金額), t2.total_pay_price FROM (SELECT count(ysw.supply_id) AS 提現次數 ,ysw.user_id AS 供應商對應的用戶 ID , ysw.supply_id AS supply_id ,SUM(ysw.money) AS 供應商提現總金額 ,
case ysw.pay_type when 10 then 微信 when 20 then 支付寶 else 銀行卡 end as 支付方式 ,
ys.supply_name AS 供應商名稱 ,ys.money AS 供應商余額 ,ys.freez_money AS 供應商凍結金額(已提現金額)FROM yoshop_supply_withdraw AS ysw LEFT JOIN yoshop_supply AS ys ON ysw.supply_id = ys.supply_id
WHERE ysw.create_time 1647446400 AND ysw.apply_status IN (10,20,40) GROUP BY ysw.supply_id
ORDER BY SUM(ysw.money) DESC ) AS t1
LEFT JOIN
(SELECT supply_id AS supply_id , SUM(total_pay_price) AS total_pay_price FROM
yoshop_order_goods WHERE create_time 1647446400 AND order_pay_status = 0
AND order_id IN(SELECT order_id FROM yoshop_order WHERE order_status IN (10,30)
AND order_id NOT IN (SELECT order_id FROM yoshop_order_refund) )
GROUP BY supply_id
ORDER BY SUM(total_pay_price) DESC ) AS t2
ON t1.suppply_id = t2.suppply_id
通過這兩次錯誤的嘗試,以及根據嘗試過程中 MySQL 給出的錯誤提示,知道自己是在左連接上使用錯誤了,應該在開始查詢出來所有的字段,left join 后不能在使用 select * 最后,回想了一遍自己所學的 left join 的語法,寫出了最后的正確的查詢結果
SELECT t1.supply_id 供應商 ID ,t1.supply_name 供應商名稱 ,t1.user_id 供應商綁定的用戶 ID ,t1.withdrawtime 供應商提現次數 ,t1.supplyallmoney 供應商提現金額 ,t1.payway 供應商提現方式 ,t1.supply_money 供應商賬戶余額 ,t1.supply_free_money 供應商凍結余額(已提現金額),
t2.total_pay_price 供應商訂單總金額 ,t2.order_id 供應商訂單數量
FROM (SELECT count(ysw.supply_id) AS withdrawtime, ysw.user_id AS user_id, ysw.supply_id AS supply_id , SUM(ysw.money) AS supplyallmoney, ysw.alipay_name AS alipay_name ,ysw.alipay_account AS alipay_account, ysw.audit_time as audit_time , ysw.bank_account AS bank_account, ysw.bank_card AS bank_card, ysw.bank_name AS bank_name,
case ysw.pay_type when 10 then 微信 when 20 then 支付寶 else 銀行卡 end as payway ,
ys.supply_name AS supply_name, ys.money AS supply_money, ys.freez_money AS supply_free_money
FROM yoshop_supply_withdraw AS ysw LEFT JOIN yoshop_supply AS ys ON ysw.supply_id = ys.supply_id
WHERE ysw.create_time 1647446400 AND ysw.apply_status IN (10,20,40) GROUP BY ysw.supply_id
ORDER BY SUM(ysw.money) DESC ) AS t1
LEFT JOIN
(SELECT supply_id AS supply_id , COUNT(order_id) AS order_id, SUM(total_pay_price) AS total_pay_price
FROM yoshop_order_goods WHERE create_time 1647446400 AND order_pay_status = 0
AND order_id IN( SELECT order_id FROM yoshop_order WHERE order_status IN (10,30)
AND order_id NOT IN ( SELECT order_id FROM yoshop_order_refund) )
GROUP BY supply_id
ORDER BY SUM(total_pay_price) DESC ) AS t2
ON t1.supply_id = t2.supply_id
正確的結果截圖:
讀到這里,這篇“MySQL 派生表聯表查詢的方法是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注丸趣 TV 行業資訊頻道。
向 AI 問一下細節丸趣 TV 網 – 提供最優質的資源集合!