<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
公司運營的一個商城系統,忽然發現訂單提現功能有問題,有大量的商戶體現金額和訂單金額不一致。於是產生了需求,需要把提現表和供應商表作為一個結果集,連線上訂單表中的訂單金額,通過計算訂單表的金額和體現表商戶提現的金額進行比對,檢視商戶是多提現了還是少提現了。
下面記錄我的查詢過程。
剛開始,第一步我以提現表為主表,查詢出來相關結果。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
正確的結果截圖:
這次查詢的經歷使我自己明顯的感覺到動手實戰才能提升自己的能力,加強自己的記憶,在查詢的時候要注意以下幾點。第一:一步步的進行查詢,不要害怕查詢資料的複雜。第二:在派生表中儘量不要使用漢字作為欄位名,只在最頂層select 查詢最終結果的時候在把欄位名 as 為“漢字”,第三:熟悉記憶左連線和union 連結的查詢語法。
到此這篇關於MySQL派生表聯表查詢的文章就介紹到這了,更多相關MySQL派生表聯表查詢內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45