2012-02-02 2 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 

Можно ли объединить эти 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' 

Вы обновляя столбцы, которые не должны быть таким образом, но вы только выполняя одно обновление не кратен, как вы бы с несколькими запросы.

Мне не нравится использование from и to как имена столбцов ... Он просто просит путанице ...

+0

Спасибо за ваш вклад, но что вы имеете в виду под «Вы обновляя столбцы, которые не делают должно быть так »? – Maverick

+0

Это означает, что если вам нужно только обновить 'from_del', вы также будете обновлять' to_del', нравится вам это или нет, вы обновляете его до того же значения, если оно не соответствует вашему условию, но вы все еще обновляете Это. – Ben

+0

- то, что else from_del и еще to_del? Считаете ли вы, что более эффективно выполнять два запроса, например, выше, или использовать часть случая? – Maverick

0

Если вы выполняете обновление, требующее два разных предложения WHERE, то, к сожалению, вам придется выполнить два запроса. Если вы беспокоитесь о производительности, вы всегда можете их выпустить в одном TRANSACTION.

Смежные вопросы