2017-12-22 21 views
2

mySqlでは、同じテーブルの他の2つのカラムの値に基づいてカラムの値(total)を設定しようとしています。mysqlのテーブルにある2つの他のcolに基づいてcol valを設定する方法は?

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

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); 

私は、ローカルの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

次のように1つのクエリを使用して、合計を計算することができます。

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

関連する問題