MySQL Преобразование команды SELECT в ОБНОВЛЕНИЕ - PullRequest
0 голосов
/ 11 января 2019

Мне было поручено обновить нашу базу данных путем изменения значения столбца "value" в таблице "ap_criteria" с 0 на 1.

Мне нужно изменить те значения для конкретной группы, которые я получаю при выполнении этого:

SELECT id, name, surname
FROM ap_volunteer 
WHERE medical_certificate = 1 
AND (id IN (SELECT DISTINCT(id_volunteer) 
FROM ap_criteria 
WHERE id_type = 177 
AND value = '0'))
ORDER BY name ASC 

У меня было несколько попыток, но мой ограниченный опыт работы с SQL определенно показывает. Вот моя последняя попытка:

UPDATE `ap_criteria`
INNER JOIN ap_volunteer ON ap_criteria.id_volunteer = ap_volunteer.id
WHERE medical_certificate = 1
AND (id IN (SELECT DISTINCT(id_volunteer) 
FROM ap_criteria
AND id_type = 177 AND value = 0))
SET ap_criteria.value = 1

К сожалению, это закончилось неудачей! Буду признателен, если кто-нибудь сможет мне помочь и направить меня в правильном направлении.

Заранее спасибо!

1 Ответ

0 голосов
/ 11 января 2019

Правильный синтаксис выглядит так:

UPDATE ap_criteria c JOIN
       ap_volunteer v
       ON c.id_volunteer = v.id
    SET c.value = 1
WHERE medical_certificate = 1 AND
      id IN (SELECT c2.id_volunteer 
             FROM ap_criteria c2 
             WHERE c2.id_type = 177 AND
                   c2.value = 0
            );

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

EDIT:

В MySQL вам нужно использовать JOIN:

UPDATE ap_criteria c JOIN
       ap_volunteer v
       ON c.id_volunteer = v.id JOIN
       (SELECT DISTINCT c2.id_volunteer 
        FROM ap_criteria c2 
        WHERE c2.id_type = 177 AND
              c2.value = 0
       ) c2
       ON v.id = c2.id_volunteer
    SET c.value = 1
WHERE medical_certificate = 1 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...