2013-10-30 1 views
0

모든 b.quantityOrdered를 반복하고 d.quantityInStock에서 해당 금액을 뺀 업데이트 쿼리가 필요합니다.상태가 바뀔 때 주문 수량으로 주문 수량과 함께 수량을 업데이트하는 sql 쿼리

select 
d.productCode as prod, 
b.quantityOrdered as qtyO, 
d.quantityInStock as qtyIS 

from orders a 
left join orderdetails b on a.orderNumber=b.orderNumber 
left join products d on b.productCode=d.productCode 
where a.status=6 and a.invoiceStatus=4 
order by 1 asc 

그 결과는 : :이 SQL 루프는 내가 업데이트가 필요한 정확하게 보여줍니다

prod qtyO qtyIS 
104 19 110 
104 4 110 
104 20 110 
105 10 20 
105 15 20 
105 24 20 

더 나은, 나는 MySQL을 DB에 함수를 만들 수 있다면 그렇게 할 때 5에서 a.status 변경 ~ 6,이 업데이트 함수는 orderdetails 테이블을 반복하고 quantityinstock에서 수량을 뺍니다.

아니면이 작업을 수행하는 PHP 함수일까요?

+0

[트리거] (http://dev.mysql.com/doc/refman/5.0/en/triggers.html)를 찾으십니까? – JDB

답변

0

여기에는 원하는 작업을 수행하는 updateInStock이라는 MySQL 트리거가 있습니다.

CREATE TRIGGER updateInStock BEFORE UPDATE ON orders 
FOR EACH ROW BEGIN 

UPDATE orders, orderdetails b, products d 
SET d.quantityInStock = d.quantityInStock - b.quantityOrdered 
WHERE NEW.orderNumber = b.orderNumber AND b.productCode = d.productCode 
AND OLD.status = 5 AND NEW.status = 6 AND 
OLD.invoiceStatus = 4 AND NEW.invoiceStatus = 4; 

END; 

UPDATE 명령 상태 orders 표 5에서 6으로 변경 제품의 재고 수량에서 주문 금액 감산하는 invoiceStatus에 변화는 없었다. OLDNEW은 트리거와 연결된 테이블 인 orders 테이블의 별명입니다. 그렇기 때문에 의 별칭으로 a을 사용하지 않았습니다. 이는 SELECT 문에서 사용한 것과 같습니다. 또한, MySQL은 복수 테이블 UPDATE 명령에서 ORDER BY을 허용하지 않습니다. 임의의 순서로 제품을 업데이트하면 응용 프로그램에 문제가 발생할 수 있는지 확인하십시오.

UPDATEWHERE 절의 일부로 SELECT 문을 결합 조건에 포함 시켰습니다. LEFT JOIN을 사용했지만 INNER JOIN을 사용하려고 한 것 같습니다. LEFT JOIN과 같은 외부 조인은 다른 테이블에 일치하는 항목이 없더라도 모든 행을 반환합니다. 귀하의 경우 주문 번호와 제품 코드가 일치하는 행만 필요하므로 INNER JOIN이 필요합니다.

MySQL 5.6의 UPDATE 명령에 대한 자세한 내용은 해당 설명서 (http://dev.mysql.com/doc/refman/5.6/en/update.html)를 참조하십시오. 트리거 문서는 http://dev.mysql.com/doc/refman/5.6/en/create-trigger.html입니다.

+0

mysql (테이블은 innoDB)은 나를 오류로 반환합니다 : SQL 구문에 오류가 있습니다. 올바른 구문을 보려면 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오. ''라인 8 – user2936578

+0

btw 근처에서 사용하십시오. 도와 주셔서 감사합니다. 많은 시간과 노력을 부탁드립니다. – user2936578

+0

구분 기호를 추가하여 오류를 해결했습니다. 구분 기호 | 각 행 UPDATE BEGIN 명령을위한 제품이 SET d.quantityInStock = d.quantityInStock D, 주문 ON UPDATE 전에 OrderDetails의 B를 트리거 updateInStock 생성 - 을 b.quantityOrdered WHERE NEW.orderNumber = b.orderNumber AND b.productCode = d.productCode AND OLD.status = 5 AND NEW.status = 6 AND OLD.orders.invoiceStatus = 4 AND NEW.orders.invoiceStatus = 4; 끝; 구분 기호. – user2936578