なぜ参加するのですか?
UPDATE products SET price_inc_vat = ROUND(price*1.3,2) WHERE vat_rate=20;
更新商品の「税込価格」を別の商品価格に更新して何を達成しようとしているのかよくわかり
ませんが、クエリに時間がかかるのは、参加方法が原因です。
mysql> create table t1 (product_id integer unsigned primary key, price decimal(10,2), price_inc_vat decimal(10,2), vat_rate integer unsigned);
mysql> insert into t1 values (1, 1.00, 1.20, 20), (2, 2.00, 2.40, 20), (3, 1.00, 1.30, 30);
mysql> select * from (t1 as s3, t1 as t3) where s3.vat_rate=20 and t3.vat_rate=20;
1 1.00 1.20 20 1 1.00 1.20 20
2 2.00 2.40 20 1 1.00 1.20 20
1 1.00 1.20 20 2 2.00 2.40 20
2 2.00 2.40 20 2 2.00 2.40 20
mysql> select s3.*, t3.*, round(s3.price * 1.3, 2) from (t1 as s3, t1 as t3) where s3.vat_rate=20 and t3.vat_rate=20;
1 1.00 1.20 20 1 1.00 1.20 20 1.30
2 2.00 2.40 20 1 1.00 1.20 20 2.60
1 1.00 1.20 20 2 2.00 2.40 20 1.30
2 2.00 2.40 20 2 2.00 2.40 20 2.60
mysql> update (t1 as s3, t1 as t3) set t3.price_inc_vat=round(s3.price*1.3, 2) where s3.vat_rate=20 and t3.vat_rate=20;
mysql> select * from (t1 as s3, t1 as t3) where s3.vat_rate=20 and t3.vat_rate=20;
1 1.00 1.30 20 1 1.00 1.30 20
2 2.00 1.30 20 1 1.00 1.30 20
1 1.00 1.30 20 2 2.00 1.30 20
2 2.00 1.30 20 2 2.00 1.30 20
以前の価格セットに基づいて製品価格を設定しようとしている場合は、おそらく次のことが物事を明確にするのに役立ちます。
mysql> create table t1 (
product_id integer unsigned,
vat_rate integer unsigned,
price decimal(10,2),
price_inc_vat decimal(10,2),
primary key(product_id, vat_rate)
);
mysql> insert into t1 (product_id, price, price_inc_vat, vat_rate) values (1, 1.00, 1.20, 20), (2, 2.00, 2.40, 20), (1, 1.00, 0, 30), (2, 2.00, 0, 30);
mysql> create temporary table tmp1 like t1;
mysql> insert into tmp1 select * from t1;
mysql> select * from t1;
1 20 1.00 1.20
1 30 1.00 0.00
2 20 2.00 2.40
2 30 2.00 0.00
mysql> select * from tmp1;
1 20 1.00 1.20
1 30 1.00 0.00
2 20 2.00 2.40
2 30 2.00 0.00
mysql> update t1 left join tmp1 on t1.product_id=tmp1.product_id and t1.vat_rate > tmp1.vat_rate set t1.price_inc_vat = round(tmp1.price*(1+t1.vat_rate/100), 2) where tmp1.vat_rate = 20;
mysql> select * from t1;
1 20 1.00 1.20
1 30 1.00 1.30
2 20 2.00 2.40
2 30 2.00 2.60