2012-02-02 162 views
0

对于一个消息传送系统,我试图标记为雇员适当to_del和from_del字段2.合并两个查询到一个在同一个表(相同列/不同行)

下面是前雇员2删除消息:

company_id | to | from | to_del | from_del 
    1  4  2  0   0 
    1  2  4  0   0 

这里是工作人员2删除邮件后:

company_id | to | from | to_del | from_del 
    1  4  2  0   1 
    1  2  4  1   0 

我要运行2个查询这个工作:

UPDATE messages SET from_del='1' WHERE company_id=1 AND from=2 
UPDATE messages SET to_del='1' WHERE company_id=1 AND to=2 

有没有办法将这两个查询合并为一个更高效的查询?例如:

UPDATE messages SET from_del='1',to_del='1' WHERE company_id=1 AND (from=2 OR to=2) 

这个单个查询的问题是,它将所有4个删除字段标记为'1'。关于如何获得一个高效的查询来处理上述2个查询的任何想法?

回答

2

听起来像是case工作...

update messages 
    set from_del = case when from = 2 then 1 else from_del end 
    , to_del = case when to = 2 then 1 else to_del end 
where company_id = '1' 

你更新不需要是这个样子列,但你只能执行一个更新不能多,你会与多个查询。

我不喜欢使用fromto列名......它只是要求混乱......

+0

感谢您的输入,但你是什么意思“你更新不列需要这样''? – Maverick 2012-02-02 16:49:01

+0

这意味着如果你只需要更新'from_del',你也会更新'to_del',不管你喜不喜欢,如果它不符合你的条件,你更新它为相同的值,但你仍然更新它。 – Ben 2012-02-02 16:56:26

+0

是从其他from_del和其他to_del?你认为运行上面的两个查询或使用case部分更有效吗? – Maverick 2012-02-02 17:04:03

0

如果您执行的更新需要两个不同的WHERE子句,那么不幸的是您将不得不执行两个查询。如果您担心表现不佳,您可以随时将其批量加入TRANSACTION

相关问题