ОБНОВИТЕ 2 строки, если обе равны без ВЫБОРА

#mysql

Вопрос:

Мой старый стол был похож на этот:

 ID  | A | B |
---- --- --- 
112 | 2 | 2 |
345 | 3 | 0 |
 

А теперь вот так:

 ID  | type | value |
---- ------ ------- 
112 | A    | 2     |
112 | B    | 2     |
345 | A    | 3     |
345 | B    | 0     |
 

Таким образом, обновление (например) A и B если оба были равны для определенного идентификатора, раньше было простым без выбора. Но в этом новом типе таблиц есть ли способ добиться того же самого?

В случае, если это невозможно, есть ли INSERT ... ON DUPLICATE KEY UPDATE у вас что-нибудь, что я мог бы использовать, чтобы сделать это возможным? (даже если это плохая практика, это только для целей тестирования!)

Комментарии:

1. Поэтому, чтобы убедиться, что я понимаю… Вы хотите обновить обе первые две строки во второй таблице, потому что они оба имеют идентификатор 112?

2. значит, идентификатор НЕ является первичным ключом?

3. я хочу обновить A и B одного и того же идентификатора (скажем, 112), если оба они равны (в данном примере это будет сделано, поскольку и A, и B из 112 равны). И первичный ключ (идентификатор,тип)

4. Если мой ответ решил вашу проблему, пожалуйста, отметьте ее как решенную. Если это не так, пожалуйста, объясните, почему это было неадекватно, и я сделаю все возможное, чтобы это исправить. Спасибо.

Ответ №1:

Это должно привести к обновлению всех строк, имеющих одинаковое значение и одинаковый идентификатор, до 5. Вы можете заменить оператор SET любыми строками или значениями, которые пожелаете.

 UPDATE new
SET value=5 
WHERE ID IN (
    SELECT ID as outerID 
    FROM new 
    WHERE (
        SELECT COUNT(DISTINCT value)
        FROM new 
        WHERE ID=outerID
    ) = 1
);
 

Я не уверен, что подзапросы противоречат вашему правилу «без выбора», но, насколько я могу судить, вам понадобится выбор для выполнения сравнения, необходимого для этого. Это также будет работать только в том случае, если ВСЕ столбцы значений строк одинаковы, а не только ТЕ, которые одинаковы.