2015-06-28 3 views
-1

Я пытаюсь обновить базу данных MySQL, но только если поле имеет значение Approved.Обновить поле, если другое поле имеет определенное значение

Если status является Approved, то Date approved следует обновить с указанием даты.

Ниже приведен код, который я использую в настоящее время, но не могу заставить его работать. Как заставить его работать?

UPDATE my_table 
SET `FieldValue`= IF(FieldName='status' AND FieldValue='Approved','".date('m/d/Y')."','') 
WHERE `SubmissionId`=".$SubmissionId." 
AND FieldName='Date Approved' 

Примеры данных

+--------+--------------+---------------+--------------+ 
| FormId | SubmissionId | FieldName | FieldValue | 
+--------+--------------+---------------+--------------+ 
|  6 |   778 | status  | Not Approved | 
|  6 |   778 | Date Approved |    | 
+--------+--------------+---------------+--------------+ 
+0

так, вы хотите сделать это по sql-запросу? вы также можете сделать это программным способом. –

+0

Как мне это сделать? – Munk

+0

прежде всего создайте функцию для проверки, где 'submissionId = $ submissionId', и если' status' является 'approved', тогда верните true, и если эта функция вернет true, обновите поле dateApproved. –

ответ

0

Используйте CASE заявление, как показано ниже:

UPDATE my_table 
SET `FieldValue` = CASE WHEN FieldName = 'status' 
AND FieldValue='Approved' THEN date('m/d/Y') ELSE `FieldValue` END 
WHERE `SubmissionId` = $SubmissionId; 

Но ваш запрос не будет иметь смысла; ваш столбец FieldValue выглядит как столбец типа строки, и вы пытаетесь хранить данные типа даты.

0

Что-то вроде этого?

$db = JFactory::getDbo(); 

$query = $db->getQuery(true); 

// Fields to update. 
$fields = array(
$db->quoteName('FieldValue') . ' = ' . $date->toSql('m/d/Y')) 
); 

// Conditions for which records should be updated. 
$conditions = array(
$db->quoteName('SubmissionId') . ' = SubmissionId', 
$db->quoteName('FieldValue') . ' = ' . $db->quote('Approved') 
); 

$query->update($db->quoteName('#__my_table'))->set($fields)->where($conditions); 

$db->setQuery($query); 

$result = $db->execute(); 
+0

Я новичок в этом. – Munk

0

Поверхностно, вы должны использовать необработанный SQL, как это:

UPDATE my_table 
     SET FieldValue = date('m/d/Y') 
    WHERE SubmissionId = 778 
     AND FieldName = 'Date Approved' 
    -- AND FieldValue IS NULL -- Optional 
    -- AND FormId = 6   -- Optional 
     AND EXISTS (SELECT * FROM my_table 
        WHERE FieldName = 'status' 
        AND FieldValue = 'Approved' 
        AND SubmissionId = 778 
        -- AND FormId = 6 -- Optional 
       ) 

Вам может понадобиться терпкими вещи немного, чтобы получить значение, встроенное в строку, которая формирует оператор SQL.

Вы не указали FormID в своем запросе; в случае сомнений вы должны дважды ограничить UPDATE с правильным значением FormID, так как вы дважды ограничиваете значение SubmissionID (как показано в комментариях). Вы можете решить, что хотите обновить поле «Дата одобрения», если оно NULL (или, возможно, пустое).

Я отмечаю, что одна из проблем с этим дизайном EAV заключается в том, что вы теряете проверку типов, которую дает вам нормальный дизайн. Вы можете сохранить дату (как предполагалось) или чистый номер или чистый текст или что-нибудь еще в столбце FieldValue для «Дата одобрения» FieldName, и нет ничего, чтобы остановить это злоупотребление. Если у вас есть ортодоксальная типизированная колонка, вы можете убедиться, что не-даты никогда не сохранялись в столбце «Дата одобрения».

Ваш UPDATE привязан к единственному идентификатору представления; так и мое. Должно быть возможно улучшить ситуацию, чтобы все неинициализированные столбцы «Дата одобрения», которые были одобрены и ранее не имели установленное значение «Дата Утверждено», фактически устанавливают его.

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