[英]How to set a col val based on 2 other cols in a table in mysql?
在mySql中,我试图基于同一表的其他2列的值设置一列的值( total
)。
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
如何做得更有效率?
您的当前查询在技术上是无效的,因为子查询正在选择未出现在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;
对于此特定问题,可接受的答案是解决之道。 但是,如果您想要的不是总和,那将是行不通的。 我的答案将使您可以执行以下操作:
SET ot.value = o.sub_value + 2*o.shipping_value
就是说,如果我们想给运输价值赋予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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.