亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL派生表聯(lián)表查詢實(shí)戰(zhàn)過(guò)程

 更新時(shí)間:2022年03月19日 15:29:05   作者:用戶227807701855  
派生表是查詢結(jié)果組成的虛擬表,派生表是在外部查詢的FROM子句中定義的,不需要手動(dòng)創(chuàng)建,下面這篇文章主要給大家介紹了關(guān)于MySQL派生表聯(lián)表查詢的相關(guān)資料,需要的朋友可以參考下

前情提要:

公司運(yùn)營(yíng)的一個(gè)商城系統(tǒng),忽然發(fā)現(xiàn)訂單提現(xiàn)功能有問(wèn)題,有大量的商戶體現(xiàn)金額和訂單金額不一致。于是產(chǎn)生了需求,需要把提現(xiàn)表和供應(yīng)商表作為一個(gè)結(jié)果集,連接上訂單表中的訂單金額,通過(guò)計(jì)算訂單表的金額和體現(xiàn)表商戶提現(xiàn)的金額進(jìn)行比對(duì),查看商戶是多提現(xiàn)了還是少提現(xiàn)了。

下面記錄我的查詢過(guò)程。

查詢過(guò)程:

剛開(kāi)始,第一步我以提現(xiàn)表為主表,查詢出來(lái)相關(guān)結(jié)果。MySQL語(yǔ)句如下

SELECT  count(ysw.supply_id) AS '提現(xiàn)次數(shù)',ysw.user_id AS '供應(yīng)商對(duì)應(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é)果如圖是正常的:

接下來(lái),我在左鏈接上訂單表的數(shù)據(jù),又添加一個(gè)了left join,金額相關(guān)數(shù)據(jù)發(fā)生了變化嚴(yán)重不一致,而且查詢時(shí)間明顯延長(zhǎng),MySQL語(yǔ)句如下

SELECT  count(ysw.supply_id) AS '提現(xiàn)次數(shù)',ysw.user_id AS '供應(yīng)商對(duì)應(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é)果對(duì)比圖如下:

經(jīng)過(guò)實(shí)踐,我想直接通過(guò)左連接查詢到提現(xiàn)表金額和訂單表金額是行不通的。通過(guò)網(wǎng)上查資料,以及在技術(shù)群里請(qǐng)教,

優(yōu)化了思路: 把提現(xiàn)的統(tǒng)計(jì)好,把訂單的統(tǒng)計(jì)好, 最后兩個(gè)結(jié)果集再根據(jù)供應(yīng)商id做個(gè)鏈接

接下來(lái)就是,三步走了, 第一步:把提現(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.查詢沒(méi)有退款的訂單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 ;

接下來(lái)就是進(jìn)行把第一步和第二步的查詢結(jié)果當(dāng)作派生表,進(jìn)行左連接查詢。我在這一步耗費(fèi)的時(shí)間和精力最多。如果你能認(rèn)真看完,相信一定會(huì)有收貨。我在這里把我錯(cuò)誤的過(guò)程也進(jìn)行了記錄 第一次錯(cuò)誤拼接:

SELECT * FROM  (
	SELECT  count(ysw.supply_id) AS '提現(xiàn)次數(shù)',ysw.user_id AS '供應(yīng)商對(duì)應(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   --  這里是錯(cuò)誤的不應(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

通過(guò)這一次試錯(cuò),明顯看出我把left join 和 union all 的含義記錯(cuò)了,并且在拼接的時(shí)候重復(fù)使用了select * from 。雖然是試錯(cuò)了,但也是有收貨的,接下來(lái)進(jìn)行了第二次錯(cuò)誤的拼接:

SELECT t1.提現(xiàn)次數(shù) ,t1.供應(yīng)商對(duì)應(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)商對(duì)應(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

通過(guò)這兩次錯(cuò)誤的嘗試,以及根據(jù)嘗試過(guò)程中MySQL給出的錯(cuò)誤提示,知道自己是在左連接上使用錯(cuò)誤了,應(yīng)該在開(kāi)始查詢出來(lái)所有的字段,left join 后不能在使用select * 最后,回想了一遍自己所學(xué)的left join的語(yǔ)法,寫(xiě)出了最后的正確的查詢結(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é)果截圖:

總結(jié):

這次查詢的經(jīng)歷使我自己明顯的感覺(jué)到動(dòng)手實(shí)戰(zhàn)才能提升自己的能力,加強(qiáng)自己的記憶,在查詢的時(shí)候要注意以下幾點(diǎn)。第一:一步步的進(jìn)行查詢,不要害怕查詢數(shù)據(jù)的復(fù)雜。第二:在派生表中盡量不要使用漢字作為字段名,只在最頂層select 查詢最終結(jié)果的時(shí)候在把字段名 as 為“漢字”,第三:熟悉記憶左連接和union 鏈接的查詢語(yǔ)法。

到此這篇關(guān)于MySQL派生表聯(lián)表查詢的文章就介紹到這了,更多相關(guān)MySQL派生表聯(lián)表查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL查詢和修改auto_increment的方法

    MySQL查詢和修改auto_increment的方法

    這篇文章主要介紹了MySQL查詢和修改auto_increment的方法,實(shí)例分析了select查詢auto_increment及ALTER修改auto_increment的技巧,需要的朋友可以參考下
    2015-02-02
  • MySQL20個(gè)高性能架構(gòu)設(shè)計(jì)原則(值得收藏)

    MySQL20個(gè)高性能架構(gòu)設(shè)計(jì)原則(值得收藏)

    這篇文章主要介紹了MySQL20個(gè)高性能架構(gòu)設(shè)計(jì)原則,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-08-08
  • 理解Mysql prepare預(yù)處理語(yǔ)句

    理解Mysql prepare預(yù)處理語(yǔ)句

    這篇文章主要幫助大家學(xué)習(xí)理解Mysql prepare預(yù)處理語(yǔ)句,對(duì)prepare預(yù)處理語(yǔ)句感興趣的小伙伴們可以參考一下
    2016-03-03
  • MySQL8.0.23安裝超詳細(xì)教程

    MySQL8.0.23安裝超詳細(xì)教程

    這篇文章主要介紹了MySQL8.0.23安裝超詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • MySQL5創(chuàng)建存儲(chǔ)過(guò)程的示例

    MySQL5創(chuàng)建存儲(chǔ)過(guò)程的示例

    存儲(chǔ)過(guò)程可以一次執(zhí)行多個(gè)sql語(yǔ)句,所以php只連接數(shù)據(jù)庫(kù)一次就能查詢多個(gè)語(yǔ)句;不過(guò)要返回多個(gè)結(jié)果集就必須用mysqli擴(kuò)展來(lái)查詢,否則會(huì)提示錯(cuò)誤can't return a result set in the given context
    2008-09-09
  • Mysql中的觸發(fā)器簡(jiǎn)單介紹及使用案例

    Mysql中的觸發(fā)器簡(jiǎn)單介紹及使用案例

    觸發(fā)器可以監(jiān)聽(tīng)著數(shù)據(jù)表的某個(gè)行為,一旦數(shù)據(jù)表的這個(gè)行為發(fā)生了,馬上執(zhí)行相應(yīng)的sql語(yǔ)句,下面有個(gè)不錯(cuò)的案例大家可以研究下
    2013-12-12
  • mysql隨機(jī)查詢10條數(shù)據(jù)的三種方法

    mysql隨機(jī)查詢10條數(shù)據(jù)的三種方法

    本文主要介紹了mysql隨機(jī)查詢10條數(shù)據(jù)的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • MySQL排序原理和案例詳析

    MySQL排序原理和案例詳析

    這篇文章主要給大家介紹了關(guān)于MySQL排序原理和案例詳析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Linux下實(shí)現(xiàn)MySQL數(shù)據(jù)備份和恢復(fù)的命令使用全攻略

    Linux下實(shí)現(xiàn)MySQL數(shù)據(jù)備份和恢復(fù)的命令使用全攻略

    這篇文章主要介紹了Linux下實(shí)現(xiàn)MySQL數(shù)據(jù)備份和恢復(fù)的命令使用全攻略,包括使用Mysqldump和LVM快照以及xtrabackup三種方法,傾力推薦!需要的朋友可以參考下
    2015-11-11
  • MySQL索引用法實(shí)例分析

    MySQL索引用法實(shí)例分析

    這篇文章主要介紹了MySQL索引用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了mysql索引的功能、定義、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-07-07

最新評(píng)論