我正面临着SQL查询的复杂情况。任务是更新多个行,具有多个值和多个条件。以下是我想要更新的数据; 要更新的字段:'sales',条件字段:'campid'和'date':
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 :(得分:21)
试试这个:
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。
答案 1 :(得分:1)
您当然不应该在一个查询中执行这些操作。相反,如果您的目标是同时以原子方式更新它们,则应在单个事务中发出多个UPDATE
语句。
您没有说明您使用的是哪个MySQL版本,也没有说明哪个存储引擎。假设InnoDB - 这是MySQL最新版本的标准,通常应该用于事务系统 - 并且假设您是从命令行客户端执行此操作,那么
mysql> set autocommit=0;
mysql> UPDATE ....;
mysql> UPDATE ....;
mysql> ...
mysql> commit;
如果您愿意,可以通过重复第一行重新启用自动提交,但值为1
:
mysql> set autocommit=1;
答案 2 :(得分:1)
我认为你最好花时间编写一个数据访问对象,以便在每个记录的基础上处理这些相当简单的操作,而不是编写一个过于复杂和耗时的sql查询。这使得以后维护代码,以及使用数据访问对象开发新代码比一次性使用复杂的SQL查询要容易得多。