2017-12-22 18 views
2

mySql에서 같은 테이블의 다른 두 열의 값을 기준으로 열 (total)의 값을 설정하려고합니다. mysql 테이블의 다른 두 열을 기반으로 col val을 설정하는 방법은 무엇입니까?

CREATE TABLE IF NOT EXISTS `order_total` (
    `order_total_id` int(10) NOT NULL AUTO_INCREMENT, 
    `order_id` int(11) NOT NULL, 
    `code` varchar(32) NOT NULL, 
    `title` varchar(255) NOT NULL, 
    `value` decimal(15,4) NOT NULL DEFAULT '0.0000', 
    `sort_order` int(3) NOT NULL, 
    PRIMARY KEY (`order_total_id`), 
    KEY `order_id` (`order_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=244 DEFAULT CHARSET=utf8; 

INSERT INTO `order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES 
(241, 80, 'sub_total', 'Sub-Total', '400.0000', 1), 
(242, 80, 'shipping', 'Free Shipping', '10.0000', 3), 
(243, 80, 'total', 'Total', '0', 9); 

http://sqlfiddle.com/#!9/e9c27a/1

나는 현지 MySQL의 작동과 같은 코드를 시도,하지만 난 아마 그것을 할 수있는 더 좋은 방법이 생각했다.

UPDATE order_total ot 
INNER JOIN (
    SELECT order_id, value 
    FROM order_total 
     WHERE code = 'sub_total' 
    GROUP BY order_id 
) o ON ot.order_id = o.order_id 
INNER JOIN (
    SELECT order_id, value 
    FROM order_total 
     WHERE code = 'shipping' 
    GROUP BY order_id 
) o2 ON ot.order_id = o2.order_id 
SET ot.value = o.value + o2.value 
WHERE ot.code = 'total' AND ot.order_id = 80 

어떻게 효율적으로 할 수 있습니까?

답변

2

다음과 같이 하나의 쿼리를 사용하여 합계를 계산할 수 있습니다

update order_total ot 
INNER JOIN (
    SELECT order_id, sum(value) value 
    FROM order_total 
    WHERE code = 'sub_total' or code= 'shipping' 
    GROUP BY order_id 
) o ON ot.order_id = o.order_id 
SET ot.value = o.value 
WHERE ot.code = 'total' AND ot.order_id = 80; 
+0

당신의 대답은 또한 아주 좋고 완벽합니다. 고마워. 어느 것이 당신의 마음에 더 효율적입니까? – Kardo

+1

이것은 복잡성이 적기 때문에 더 나은 대답입니다. IMHO –

+0

이전 답변을 이미 정확하게 표시했습니다! 나는 지금 무엇을해야합니까!? : - | – Kardo

2

서브 쿼리가 GROUP BY 절에 나타나지 않는 집계되지 않은 열을 선택하기 때문에 현재 쿼리가 기술적으로 유효하지 않습니다. 그러나 우리는 각 주문에 대한 소계 및 배송 값을 찾기 위해 조건부 집계를 사용하여이 문제를 해결하고, 쿼리가 더 간결 만들 수 있습니다

이 특정 문제에 대한
UPDATE order_total ot 
INNER JOIN 
(
    SELECT 
     order_id, 
     MAX(CASE WHEN code = 'sub_total' THEN value END) AS sub_value, 
     MAX(CASE WHEN code = 'shipping' THEN value END) AS shipping_value, 
    FROM order_total 
    GROUP BY order_id 
) o 
    ON ot.order_id = o.order_id 
SET ot.value = o.sub_value + o.shipping_value 
WHERE 
    ot.code = 'total' AND 
    ot.order_id = 80; 

이 허용 대답이 갈 수있는 방법입니다. 하지만 합계가 아닌 다른 것을 원한다면 효과가 없을 것입니다. 우리는 선적 값 2의 가중치를 부여하고 싶다면,이 답변이 허용됩니다

SET ot.value = o.sub_value + 2*o.shipping_value 

쉽게 수행 할 : 내 대답은 당신이 그런 짓을 할 것입니다.

+0

와우! 완벽한 대답! 고마워요. '팀'. 넌 나를 구했다! – Kardo

+0

다음은이 간단한 솔루션이 있어야한다고 생각합니다. 내가 그걸 찾으려고하자. –

+0

@Tim :-D 나는 그렇게하도록 내가 기다리고있다. 1 분 남았습니다! – Kardo