如果其他字段具有特定值,则更新字段

时间:2015-06-28 17:38:44

标签: mysql sql

我正在尝试更新MySQL数据库,但前提是字段的值为Approved

如果statusApproved,则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 |              |
+--------+--------------+---------------+--------------+

3 个答案:

答案 0 :(得分: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列看起来像字符串类型列,并且您正在尝试存储日期类型数据。

答案 1 :(得分: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();

答案 2 :(得分: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;如果有疑问,您应该使用正确的FormID值约束UPDATE两次,就像您将SubmissionID值约束两次一样(如注释中所示)。您可能决定只想更新“已批准日期”'字段名称为NULL(或者可能为空)。

我注意到这个EAV设计的一个问题是你丢失了正常设计给你的类型检查。您可以在FieldValue列中存储日期(按预期),纯数字,纯文本或其他任何内容,以及“批准日期”。 FieldName并没有什么可以阻止这种滥用行为发生。如果您有一个正统的类型列,则可以确保非日期永远不会存储在“已批准日期”中。列。

您的更新与单个提交ID相关联;我的也是。应该可以增强一些东西,以便所有未初始化的日期批准'经过批准且之前未获得“批准日期”的列。实际上,值设置确实已经设置好了。