您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“MySQL派生表聯(lián)表查詢的方法是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“MySQL派生表聯(lián)表查詢的方法是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
公司運(yùn)營的一個商城系統(tǒng),忽然發(fā)現(xiàn)訂單提現(xiàn)功能有問題,有大量的商戶體現(xiàn)金額和訂單金額不一致。于是產(chǎn)生了需求,需要把提現(xiàn)表和供應(yīng)商表作為一個結(jié)果集,連接上訂單表中的訂單金額,通過計(jì)算訂單表的金額和體現(xiàn)表商戶提現(xiàn)的金額進(jìn)行比對,查看商戶是多提現(xiàn)了還是少提現(xiàn)了。
下面記錄我的查詢過程。
剛開始,第一步我以提現(xiàn)表為主表,查詢出來相關(guān)結(jié)果。MySQL語句如下
SELECT count(ysw.supply_id) AS '提現(xiàn)次數(shù)',ysw.user_id AS '供應(yīng)商對應(yīng)的用戶ID', ysw.supply_id AS '供應(yīng)商ID' ,SUM(ysw.money) AS '供應(yīng)商提現(xiàn)總金額', case ysw.pay_type when 10 then '微信' when 20 then '支付寶' else '銀行卡' end as '支付方式' , ys.supply_name AS '供應(yīng)商名稱',ys.money AS '供應(yīng)商余額',ys.freez_money AS '供應(yīng)商凍結(jié)金額(已提現(xiàn)金額)' 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 ;
查詢結(jié)果如圖是正常的:
接下來,我在左鏈接上訂單表的數(shù)據(jù),又添加一個了left join,金額相關(guān)數(shù)據(jù)發(fā)生了變化嚴(yán)重不一致,而且查詢時(shí)間明顯延長,MySQL語句如下
SELECT count(ysw.supply_id) AS '提現(xiàn)次數(shù)',ysw.user_id AS '供應(yīng)商對應(yīng)的用戶ID', ysw.supply_id AS '供應(yīng)商ID' ,SUM(ysw.money) AS '供應(yīng)商提現(xiàn)總金額', case ysw.pay_type when 10 then '微信' when 20 then '支付寶' else '銀行卡' end as '支付方式' , ys.supply_name AS '供應(yīng)商名稱',ys.money AS '供應(yīng)商余額',ys.freez_money AS '供應(yīng)商凍結(jié)金額(已提現(xiàn)金額)',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 ;
查詢結(jié)果對比圖如下:
經(jīng)過實(shí)踐,我想直接通過左連接查詢到提現(xiàn)表金額和訂單表金額是行不通的。通過網(wǎng)上查資料,以及在技術(shù)群里請教,
優(yōu)化了思路: 把提現(xiàn)的統(tǒng)計(jì)好,把訂單的統(tǒng)計(jì)好, 最后兩個結(jié)果集再根據(jù)供應(yīng)商id做個鏈接
接下來就是,三步走了, 第一步:把提現(xiàn)的統(tǒng)計(jì)好,上面第一次嘗試的第一步就是了, 第二步:把訂單表的數(shù)據(jù)統(tǒng)計(jì)好。由于使用系統(tǒng)的原因,我直接使用的訂單商品表計(jì)算的訂單總金額,這一步也是分三步走的,我直接上代碼:
1.查詢yoshop_order所有進(jìn)行中,已完成的 訂單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 '供應(yīng)商ID' , SUM(total_pay_price) AS '供應(yīng)商訂單總金額' 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 ;
接下來就是進(jìn)行把第一步和第二步的查詢結(jié)果當(dāng)作派生表,進(jìn)行左連接查詢。我在這一步耗費(fèi)的時(shí)間和精力最多。如果你能認(rèn)真看完,相信一定會有收貨。我在這里把我錯誤的過程也進(jìn)行了記錄 第一次錯誤拼接:
SELECT * FROM ( SELECT count(ysw.supply_id) AS '提現(xiàn)次數(shù)',ysw.user_id AS '供應(yīng)商對應(yīng)的用戶ID', ysw.supply_id AS 'supply_id' ,SUM(ysw.money) AS '供應(yīng)商提現(xiàn)總金額', case ysw.pay_type when 10 then '微信' when 20 then '支付寶' else '銀行卡' end as '支付方式' , ys.supply_name AS '供應(yīng)商名稱',ys.money AS '供應(yīng)商余額',ys.freez_money AS '供應(yīng)商凍結(jié)金額(已提現(xiàn)金額)' 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 -- 這里是錯誤的不應(yīng)該在查詢 (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 的含義記錯了,并且在拼接的時(shí)候重復(fù)使用了select * from 。雖然是試錯了,但也是有收貨的,接下來進(jìn)行了第二次錯誤的拼接:
SELECT t1.提現(xiàn)次數(shù) ,t1.供應(yīng)商對應(yīng)的用戶ID ,t1.supply_id, t1.支付方式 ,t1.供應(yīng)商名稱,t1.供應(yīng)商余額, t1.供應(yīng)商凍結(jié)金額(已提現(xiàn)金額), t2.total_pay_price FROM ( SELECT count(ysw.supply_id) AS '提現(xiàn)次數(shù)',ysw.user_id AS '供應(yīng)商對應(yīng)的用戶ID', ysw.supply_id AS supply_id ,SUM(ysw.money) AS '供應(yīng)商提現(xiàn)總金額', case ysw.pay_type when 10 then '微信' when 20 then '支付寶' else '銀行卡' end as '支付方式' , ys.supply_name AS '供應(yīng)商名稱',ys.money AS '供應(yīng)商余額',ys.freez_money AS '供應(yīng)商凍結(jié)金額(已提現(xiàn)金額)' 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
通過這兩次錯誤的嘗試,以及根據(jù)嘗試過程中MySQL給出的錯誤提示,知道自己是在左連接上使用錯誤了,應(yīng)該在開始查詢出來所有的字段,left join 后不能在使用select * 最后,回想了一遍自己所學(xué)的left join的語法,寫出了最后的正確的查詢結(jié)果
SELECT t1.supply_id '供應(yīng)商ID',t1.supply_name '供應(yīng)商名稱',t1.user_id '供應(yīng)商綁定的用戶ID',t1.withdrawtime '供應(yīng)商提現(xiàn)次數(shù)' ,t1.supplyallmoney '供應(yīng)商提現(xiàn)金額',t1.payway '供應(yīng)商提現(xiàn)方式',t1.supply_money '供應(yīng)商賬戶余額',t1.supply_free_money '供應(yīng)商凍結(jié)余額(已提現(xiàn)金額)', t2.total_pay_price '供應(yīng)商訂單總金額',t2.order_id '供應(yīng)商訂單數(shù)量' 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
正確的結(jié)果截圖:
讀到這里,這篇“MySQL派生表聯(lián)表查詢的方法是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。