我正在尝试更新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 :(得分: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相关联;我的也是。应该可以增强一些东西,以便所有未初始化的日期批准'经过批准且之前未获得“批准日期”的列。实际上,值设置确实已经设置好了。