91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL派生表聯表查詢的方法是什么

發布時間:2023-05-10 09:18:54 來源:億速云 閱讀:122 作者:zzz 欄目:MySQL數據庫

本文小編為大家詳細介紹“MySQL派生表聯表查詢的方法是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“MySQL派生表聯表查詢的方法是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

前情提要:

公司運營的一個商城系統,忽然發現訂單提現功能有問題,有大量的商戶體現金額和訂單金額不一致。于是產生了需求,需要把提現表和供應商表作為一個結果集,連接上訂單表中的訂單金額,通過計算訂單表的金額和體現表商戶提現的金額進行比對,查看商戶是多提現了還是少提現了。

下面記錄我的查詢過程。

查詢過程:

剛開始,第一步我以提現表為主表,查詢出來相關結果。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 ;

查詢結果如圖是正常的:

MySQL派生表聯表查詢的方法是什么

接下來,我在左鏈接上訂單表的數據,又添加一個了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 ;

查詢結果對比圖如下:

MySQL派生表聯表查詢的方法是什么

經過實踐,我想直接通過左連接查詢到提現表金額和訂單表金額是行不通的。通過網上查資料,以及在技術群里請教,

優化了思路: 把提現的統計好,把訂單的統計好, 最后兩個結果集再根據供應商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派生表聯表查詢的方法是什么

讀到這里,這篇“MySQL派生表聯表查詢的方法是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

松原市| 浙江省| 拉孜县| 焉耆| 靖西县| 柞水县| 衢州市| 涡阳县| 逊克县| 白水县| 额敏县| 普兰县| 修文县| 定安县| 赤壁市| 琼海市| 嘉定区| 赤水市| 中阳县| 昭苏县| 甘南县| 天峻县| 内丘县| 霞浦县| 马边| 巴林右旗| 阳江市| 洛隆县| 八宿县| 潼关县| 连南| 运城市| 鱼台县| 泽普县| 泸定县| 左贡县| 柳州市| 奉化市| 旬邑县| 丹巴县| 蓝山县|