Таблица обновления MySQL по значениям соответствия в том же столбце - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть таблица, в которой я храню данные для разных групп, и мне нужно обновить одну группу, если значения в одном столбце совпадают.

таблица выглядит так:

prop_id | group_id | value | visible
1       | 1        | 10    | 1
1       | 2        | 10    | 1
1       | 3        | 15    | 1
2       | 1        | 10    | 1
2       | 2        | 10    | 1
2       | 3        | 10    | 1

Поэтому я хочу установить для столбца visible значение 0 для group_id=3, если значения в столбце value равны group_id=1. В этом случае, если value=10 для обоих group_id=1 and group_id=3, чем установлено visible=0 для group_id=3

ожидаемый результат после обновления

prop_id | group_id | value | visible
1       | 1        | 10    | 1
1       | 2        | 10    | 1
1       | 3        | 15    | 1
2       | 1        | 10    | 1
2       | 2        | 10    | 1
2       | 3        | 10    | 0

Как это возможно?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Впишите это как SELECT.

Начните с простого, мы знаем, что мы хотим обновить строки group_id=3 и visible=1, поэтому напишите запрос, который получит все эти строки:

SELECT g3.value
     , g3.visible 
  FROM mytable g3
 WHERE g3.group_id = 3
   AND g3.visible  = 1 

Мы знаем, что строки, которые мы хотим обновить, находятся в этом наборе, но есть некоторые дополнительные условия.

Итак, мы расширяем это. В соответствии со спецификацией, нам нужно выяснить, есть ли какие-либо подходящие строки group_id=1, visible=1 (соответствующие value).

Мы можем сделать эту проверку либо с помощью коррелированного подзапроса EXISTS, либо с помощью JOIN.

SELECT g3.group_id
     , g3.value
     , g3.visible
  FROM mytable g3
 WHERE g3.group_id = 3
   AND g3.visible  = 1
   AND EXISTS ( SELECT 1
                  FROM mytable g1
                 WHERE g1.group_id = 1
                   AND g1.visible  = 1
                   AND g1.value    = g3.value 
              )

-или-

SELECT g3.group_id
     , g3.value
     , g3.visible
  FROM mytable g3
  JOIN mytable g1 
    ON g1.group_id = 1
   AND g1.visible  = 1 
   AND g1.value    = g3.value
 WHERE g3.group_id = 3
   AND g3.visible  = 1

Убедитесь, что запрос возвращает строки, которые мы хотим обновить, при определенных условиях. (Гораздо проще проверить результаты оператора SELECT и, при необходимости, настроить его, чем оператор UPDATE.)

После того как запрос SELECT работает и проверен (возвращает строки, которые мы хотим обновить), мы можем преобразовать его в оператор UPDATE. Замените SELECT ... FROM на UPDATE и добавьте предложение SET, которое возвращает строки

UPDATE mytable g3
  JOIN mytable g1 
    ON g1.group_id = 1
   AND g1.visible  = 1
   AND g1.value    = g3.value

   SET g3.visible  = 0 

 WHERE g3.group_id = 3
   AND g3.visible  = 1
0 голосов
/ 29 апреля 2018

Используйте Self JOIN, затем UPDATE

Вы можете попробовать это.

UPDATE T t1 
JOIN T t2 on t1.group_id = t2.group_id 
and t1.rop_id<>t2.rop_id and t1.value > t2.value 
SET t2.visible = 0

sqlfiddle: http://sqlfiddle.com/#!9/6f06de/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...