회사에서 운영하는 쇼핑몰 시스템에서 갑자기 주문 철회 기능에 문제가 있다는 사실을 발견했습니다. 많은 가맹점에서 주문 금액과 일치하지 않는다는 신고가 접수되었습니다. 그래서 수요가 발생하여 출금테이블과 공급업체 테이블을 결과세트로 활용하고, 주문테이블의 주문금액을 연결하고, 주문테이블의 금액과 반영테이블의 가맹점이 출금한 금액을 비교해야 했습니다. 판매자가 더 많은 돈을 인출했는지 확인합니다.
내 쿼리 과정이 아래에 기록되어 있습니다.
처음에는 첫 번째 단계에서 출금 테이블을 메인 테이블로 사용하여 관련 결과를 쿼리했습니다. 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 문은 다음과 같습니다
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를 기반으로 링크를 만듭니다
The 다음 단계는 3단계입니다. 첫 번째 단계: 출금 통계를 수집합니다. 위 시도의 첫 번째 단계는 두 번째 단계: 주문 테이블의 데이터를 수집하는 것입니다. 시스템 사용으로 인해 주문 상품 테이블을 직접 사용하여 총 주문 금액을 계산합니다. 이 단계도 3단계로 나누어져 있습니다. 코드를 직접 입력합니다:
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 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에서 제공한 오류 프롬프트를 기반으로 나는 내가 나라는 것을 알았습니다. 왼쪽 조인을 사용하는 데 실수가 있었습니다. 처음에 모든 필드를 쿼리해야 합니다. 왼쪽 조인 후에는 select *를 사용할 수 없습니다. 마지막으로 배운 왼쪽 조인 구문을 기억하고 최종 올바른 쿼리 결과를 작성했습니다. 결과 스크린샷:
위 내용은 MySQL 파생 테이블 조인 테이블 쿼리 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!