2011-12-05 76 views
12

我面临着SQL查询的复杂情况。任务是更新多个行,具有多个值和多个条件。以下是我想要更新的数据; 字段更新:“销售”,条件字段:“campid”和“日期”:更新具有多个值和多个条件的多行mysql

if campid = 259 and date = 22/6/2011 then set sales = $200 
else if campid = 259 and date = 21/6/2011 then set sales = $210 
else if campid = 260 and date = 22/6/2011 then set sales = $140 
else if campid = 260 and date = 21/6/2011 then set sales = $150 

我要更新所有这些在一个查询。

+0

投票反对downvote没有评论。我认为如果有人不了解交易,这是一个合理的问题。 –

回答

19

试试这个:

UPDATE your_table SET sales = 
CASE 
    WHEN campid = 259 AND date = 22/6/2011 THEN 200 
    WHEN campid = 259 AND date = 21/6/2011 THEN 210 
    WHEN campid = 259 AND date = 22/6/2011 THEN 140 
    WHEN campid = 259 AND date = 21/6/2011 THEN 150 
    ELSE sales 
END 

当然,我不知道日期字段是否真的是DATE或DATETIME,所以我留下了查询,显示你可以做什么,但也许你必须根据数据类型修复日期比较。 如果日期字段是DATE(因为它应该),您可以编写AND date = '2011-06-22'等。
注意ELSE条件:有必要避免记录不落在其他情况下将被设置为NULL。

+0

谢谢Marco。 –

+0

我在我的问题中使用了这个例子,它工作。经过很长时间,我得出结论,这种类型的查询在少量数据上提供最佳性能。如果表中有数百万条记录,则使用参数中的主键一次更新单条记录会节省大量时间,从而产生更好的性能。 –

+0

谢谢,我救了这个夜晚 –

1

你当然不应该在单个查询中做这些事情。相反,如果您的目标是以原子方式自动更新它们,则应同时在单个交易中发出几条UPDATE对帐单。

你不会说你使用哪个MySQL版本,也不会说哪个存储引擎。假设InnoDB的 - 这是标准的最新版本的MySQL和一般应使用交易系统 - 也假设你在命令行客户这样做,你会

mysql> set autocommit=0; 
mysql> UPDATE ....; 
mysql> UPDATE ....; 
mysql> ... 
mysql> commit; 

然后,您可以重新启用自动提交,如果你像通过重复第一线,但随着1值:

mysql> set autocommit=1; 
+0

imo,这不回答什么OP要求 – ajreal

+0

我虚心不同意。问题中提出的If-elseif-elseif等构造,加上他想同时更新所有字段的说法,正是我的答案所能做到的。当然,还有其他方法可以做到这一点,如果一个陈述真的需要(!)。 –

+0

丹尼尔是正确的。我曾要求多次执行某些条件。 –

1

与其写出一个太复杂且涉及时间的sql查询,我相信你会花更多的时间写一个数据访问对象来处理每个记录的这些相当简单的操作。这使得代码的后续维护,以及使用您的数据访问对象开发新代码比一次性使用复杂的SQL查询更容易。