Rumah > Artikel > pangkalan data > Contoh analisis bagi pertanyaan jadual gabungan jadual terbitan MySQL
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.
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:
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 '提现次数',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 ;
Carta perbandingan hasil pertanyaan. adalah seperti berikut:
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 '供应商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 ;
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 '提现次数',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
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 '提现次数',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
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 '供应商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
Tangkapan skrin hasil yang betul:
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!