Rumah >pangkalan data >tutorial mysql >Contoh analisis bagi pertanyaan jadual gabungan jadual terbitan MySQL

Contoh analisis bagi pertanyaan jadual gabungan jadual terbitan MySQL

PHPz
PHPzke hadapan
2023-04-17 18:40:061251semak imbas

Ringkasan awal:

Sistem pusat membeli-belah yang dikendalikan oleh syarikat tiba-tiba mendapati terdapat masalah dengan fungsi pengeluaran pesanan, dan sebilangan besar peniaga melaporkan bahawa jumlah itu tidak konsisten dengan jumlah pesanan. Oleh itu, permintaan timbul adalah perlu untuk menggunakan jadual pengeluaran dan jadual pembekal sebagai set hasil, sambungkan jumlah pesanan dalam jadual pesanan, dan bandingkan jumlah dalam jadual pesanan dengan jumlah yang dikeluarkan oleh pedagang dalam jadual pantulan. untuk menyemak sama ada peniaga telah mengeluarkan lebih banyak wang Masih kurang pengeluaran.

Yang berikut merekodkan proses pertanyaan saya.

Proses pertanyaan:

Pada mulanya, pada langkah pertama, saya menggunakan jadual pengeluaran sebagai jadual utama untuk menanyakan hasil yang berkaitan. Pernyataan MySQL adalah seperti berikut

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 ;

Hasil pertanyaan adalah normal seperti yang ditunjukkan:

Contoh analisis bagi pertanyaan jadual gabungan jadual terbitan MySQL

Seterusnya, saya menambah data jadual pesanan pada pautan kiri dan ditambah Selepas penyertaan kiri, data berkaitan jumlah telah berubah secara serius dan tidak konsisten, dan masa pertanyaan telah dilanjutkan dengan ketara Penyataan MySQL adalah seperti berikut:

SELECT  count(ysw.supply_id) AS &#39;提现次数&#39;,ysw.user_id AS &#39;供应商对应的用户ID&#39;, ysw.supply_id  AS &#39;供应商ID&#39; ,SUM(ysw.money)  AS &#39;供应商提现总金额&#39;,
case ysw.pay_type when 10 then &#39;微信&#39; when 20 then &#39;支付宝&#39; else &#39;银行卡&#39; end as &#39;支付方式&#39; ,
ys.supply_name AS &#39;供应商名称&#39;,ys.money AS &#39;供应商余额&#39;,ys.freez_money AS &#39;供应商冻结金额(已提现金额)&#39;,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 ;

Carta perbandingan hasil pertanyaan. adalah seperti berikut:

Contoh analisis bagi pertanyaan jadual gabungan jadual terbitan MySQL

Selepas berlatih, saya rasa tidak boleh membuat pertanyaan terus amaun jadual pengeluaran dan jumlah jadual pesanan melalui join kiri. Dengan menyemak maklumat dalam talian dan meminta nasihat dalam kumpulan teknikal,

mengoptimumkan idea: buat statistik yang baik tentang pengeluaran tunai, buat statistik yang baik tentang pesanan dan buat pautan berdasarkan ID pembekal untuk dua keputusan terakhir sets

Langkah seterusnya ialah melalui tiga langkah Langkah pertama: Kumpul statistik pengeluaran Langkah pertama dalam percubaan pertama di atas ialah langkah pertama: Kumpul data pesanan meja. Oleh kerana penggunaan sistem, saya terus menggunakan jadual produk untuk mengira jumlah pesanan Langkah ini juga dibahagikan kepada tiga langkah Saya terus memasukkan kod:

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 &#39;供应商ID&#39; , SUM(total_pay_price)  AS &#39;供应商订单总金额&#39; 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 ;

Langkah seterusnya ialah untuk melaksanakan langkah pertama Dan hasil pertanyaan dalam langkah kedua digunakan sebagai jadual terbitan untuk melaksanakan pertanyaan gabungan kiri. Ini adalah langkah di mana saya menghabiskan paling banyak masa dan tenaga. Jika anda boleh membacanya dengan teliti, saya percaya anda akan menerimanya. Saya juga merekodkan proses saya yang salah di sini. Penyambungan yang salah yang pertama:

SELECT * FROM  (
	SELECT  count(ysw.supply_id) AS &#39;提现次数&#39;,ysw.user_id AS &#39;供应商对应的用户ID&#39;, ysw.supply_id  AS &#39;supply_id&#39; ,SUM(ysw.money)  AS &#39;供应商提现总金额&#39;,
	case ysw.pay_type when 10 then &#39;微信&#39; when 20 then &#39;支付宝&#39; else &#39;银行卡&#39; end as &#39;支付方式&#39; ,
	ys.supply_name AS &#39;供应商名称&#39;,ys.money AS &#39;供应商余额&#39;,ys.freez_money AS &#39;供应商冻结金额(已提现金额)&#39;
	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 &#39;supply_id&#39; , 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

Melalui percubaan dan ralat ini, adalah jelas bahawa saya telah salah mengingati maksud gabungan kiri dan kesatuan semua, dan Pilih * daripada digunakan berulang kali semasa splicing. Walaupun ia adalah percubaan dan kesilapan, barangan telah diterima, dan kemudian penyambungan salah kedua telah dijalankan:

SELECT t1.提现次数 ,t1.供应商对应的用户ID ,t1.supply_id, t1.支付方式 ,t1.供应商名称,t1.供应商余额, t1.供应商冻结金额(已提现金额), t2.total_pay_price FROM  (
SELECT  count(ysw.supply_id) AS &#39;提现次数&#39;,ysw.user_id AS &#39;供应商对应的用户ID&#39;, ysw.supply_id  AS supply_id ,SUM(ysw.money)  AS &#39;供应商提现总金额&#39;,
case ysw.pay_type when 10 then &#39;微信&#39; when 20 then &#39;支付宝&#39; else &#39;银行卡&#39; end as &#39;支付方式&#39; ,
	ys.supply_name AS &#39;供应商名称&#39;,ys.money AS &#39;供应商余额&#39;,ys.freez_money AS &#39;供应商冻结金额(已提现金额)&#39;
	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

Melalui dua percubaan yang salah ini, dan mengikut mesej ralat yang diberikan oleh MySQL semasa percubaan Mesej ralat: Saya tahu bahawa saya telah menggunakan gabungan kiri yang salah Saya harus menanyakan semua medan pada mulanya Saya tidak boleh menggunakan gabungan selepas kiri * Akhirnya, Saya mengingati sintaks gabungan kiri yang saya pelajari dan tulis Akhir hasil pertanyaan yang betul

SELECT t1.supply_id &#39;供应商ID&#39;,t1.supply_name &#39;供应商名称&#39;,t1.user_id &#39;供应商绑定的用户ID&#39;,t1.withdrawtime &#39;供应商提现次数&#39; ,t1.supplyallmoney &#39;供应商提现金额&#39;,t1.payway &#39;供应商提现方式&#39;,t1.supply_money &#39;供应商账户余额&#39;,t1.supply_free_money &#39;供应商冻结余额(已提现金额)&#39;,
t2.total_pay_price &#39;供应商订单总金额&#39;,t2.order_id &#39;供应商订单数量&#39;
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 &#39;微信&#39; when 20 then &#39;支付宝&#39; else &#39;银行卡&#39; 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 &#39;supply_id&#39; , 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

Tangkapan skrin hasil yang betul:

Contoh analisis bagi pertanyaan jadual gabungan jadual terbitan MySQL

Atas ialah kandungan terperinci Contoh analisis bagi pertanyaan jadual gabungan jadual terbitan MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam