将一列乘以另一个表中的列

时间:2014-07-07 21:44:56

标签: mysql

我创建了table1,我可以通过表单更新,所以如果我需要更改价格百分比,我可以不需要编辑代码。 我从csv文件导入并创建临时表2。新的临时表2有物品成本,所以我需要乘以百分比来得到售价,因此表1中的价格百分比。

%是table1中的一列,我想按行id选择它,importID是列ID,这两个都在table1中,我可以通过表单更新。我需要按行ID选择未来增长和多个百分比。

我想将临时表2中的price列乘以我的永久表1中的百分比列。

这是给我一个语法错误的部分

  SELECT percent FROM my_table1 WHERE importID = 1

这是定价更新代码

  UPDATE my_temp_table2
  SELECT percent FROM my_table1 WHERE importID = 1
  SET Price = (Price * percent);

3 个答案:

答案 0 :(得分:1)

您似乎正在尝试“将其插入变量”,这与SQL的运行方式不同。

这样的事情怎么样:

UPDATE my_temp_table2
SET Price = Price * (SELECT percent FROM my_table1 WHERE importID = 1);

它不是超级高效的,但对于一次性更新,它应该可以正常工作。

答案 1 :(得分:1)

这应该是

UPDATE my_temp_table2
SET Price = Price * (SELECT percent FROM my_table1 WHERE importID = 1);

这会将my_temp_table2中的所有价格与my_table1中为importID 1找到的价格相乘。

以下是使用变量的替代方法:

SELECT @percent := percent
FROM my_table1 WHERE importID = 1;

UPDATE my_temp_table2
SET Price = Price * @percent;

答案 2 :(得分:0)

您想更新Price所有行中的my_temp_table2列吗?根据{{​​1}}返回的单行percent列的值?

这是实现这一目标的一种方法:

my_table1

如果您的问题UPDATE my_temp_table2 t CROSS JOIN ( SELECT p.percent FROM my_table1 p WHERE p.importID = 1 ORDER BY p.percent LIMIT 1 ) q SET t.Price = t.Price * q.percent importID中的PRIMARY KEY(或UNIQUE KEY},则可以避免使用内联视图。内联视图查询中LIMIT和ORDER BY子句的目的是确保返回不超过1行,并使结果具有确定性。 (还有其他方法可以实现此目的,例如my_table1MIN()聚合。)

如果MAX()中的importID是唯一的,您可以简化上面的查询,只需引用该表而不使用内联视图:

my_table1

在运行UPDATE之前,首先将其作为SELECT语句编写通常是有益的。只需将UPDATE my_temp_table2 t JOIN my_table1 q ON q.importID = 1 SET t.Price = t.Price * q.percent 关键字替换为UPDATE,然后删除SELECT ... FROM子句即可。例如:

SET

SELECT t.Price AS `old_price` , q.percent AS `percent` , t.Price * q.percent AS `new_price` FROM my_temp_table2 t JOIN my_table1 q ON q.importID = 1 替换为SELECT ... FROM关键字,将其更改回UPDATE,并添加UPDATE子句(将返回new_price的表达式的结果分配给Price列)

请注意,如果在SET中找不到匹配的行,则查询/更新将返回/更新零行。

如果不使用JOIN操作,而是在my_table1子句中使用子查询,则子查询返回的SET值将导致分配NULL值到NULL列。