MySQL - объединение 2 запросов, которые имеют различные предложения SET и WHERE - PullRequest
1 голос
/ 31 июля 2011

Некоторое время назад @Richard Harris дал отличный ответ на похожий вопрос , но я считаю, что моя ситуация немного отличается.

Как видите, у меня есть 2 последовательных оператора UPDATE, предназначенных для одной и той же таблицы и полей, но с разными предложениями SET и WHERE.

$this->db->query("
UPDATE user_profiles
SET    reputation = reputation + 15
WHERE  user_id = $answer_author_id;
");

$this->db->query("
UPDATE user_profiles
SET    reputation = reputation + 2
WHERE  user_id = $user_id;
");

Интересно, можно ли это объединить в один запрос, или это требует дальнейшей нормализации. Кроме того, эти последовательные запросы слишком неэффективны? Если нет, я бы не стал пытаться объединить в один запрос.

Ваши мысли по этому поводу очень ценятся.

Ответы [ 3 ]

2 голосов
/ 31 июля 2011

вы можете сделать это:

UPDATE user_profiles
SET    reputation = reputation + 
           case when user_id = $answer_author_id then 15
                when user_id = $user_id then 2
                else 0
           end
WHERE  user_id = $answer_author_id or user_id = $user_id;
1 голос
/ 31 июля 2011

ОБНОВЛЕНИЕ user_profiles SET репутация = репутация + ЕСЛИ (user_id = $ answer_author_id, 15,2) ГДЕ user_id = $ answer_author_id ИЛИ user_id = $ answer_author_id;

Это работает, но я рекомендую использовать 2 запроса просто для удобочитаемости кода, если только эффективность не очень важна.

1 голос
/ 31 июля 2011

Решение на самом деле не сильно отличается от этого , просто чуть более вложенное.

UPDATE my_table SET reputation = 
    IF( USER_ID = $user_id, REPUTATION + 2, REPUTATION + 15 ) 
        WHERE USER_ID IN ( $user_id, $answer_author_id );
...