1

我在这里尝试做的是:如果 $done 中标识的表 todo 中的记录在列 recurinterval 中有一个值,那么然后重置 date_scheduled 列 ELSE 只需将这些记录的 status_id 列设置为 6。

这是我从 mysql_error() 得到的错误...

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“CASE recurinterval != 0 AND recurinterval IS NOT NULL THEN SET date_sche”附近使用正确的语法

我怎样才能使这个声明有效?

UPDATE todo 
CASE recurinterval != 0 AND recurinterval IS NOT NULL THEN
SET date_scheduled = CASE recurunit
WHEN 'DAY' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval DAY)
WHEN 'WEEK' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval WEEK)
WHEN 'MONTH' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval MONTH)
WHEN 'YEAR' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval YEAR)
END
WHERE todo_id IN ($done) 
ELSE 
SET status_id = 6 WHERE todo_id IN ($done)
END

在我像上面那样修改之前,下面的 mySQL 语句工作得很好。

UPDATE todo 
SET date_scheduled = CASE recurunit
WHEN 'DAY' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval DAY)
WHEN 'WEEK' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval WEEK)
WHEN 'MONTH' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval MONTH)
WHEN 'YEAR' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval YEAR)
END
WHERE todo_id IN ($done) 
AND recurinterval != 0 
AND recurinterval IS NOT NULL
4

3 回答 3

1

问题是您正在尝试仅使用一个查询来做 afaik 无法做到的事情。您想根据 recurinterval 字段的值更新 2 列中的 1 列。所以基本上你应该把它分成2个查询,第一个就是你拥有的那个。

UPDATE todo 
SET date_scheduled = CASE recurunit
WHEN 'DAY' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval DAY)
WHEN 'WEEK' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval WEEK)
WHEN 'MONTH' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval MONTH)
WHEN 'YEAR' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval YEAR)
END
WHERE todo_id IN ($done) 
AND recurinterval != 0 
AND recurinterval IS NOT NULL

第二个将用于其他行:

UPDATE todo 
SET status_id = 6
WHERE todo_id IN ($done) 
AND (recurinterval = 0 
OR recurinterval IS NULL)

如果您运行这些查询(很可能您希望在事务中运行它们,以便在其中一个查询期间发生错误时可以回滚更改),您应该得到您想要的结果。

于 2010-03-29T07:17:00.983 回答
0

在我看来,您修改后的声明中的第一个案例CASE recurinterval != 0 AND recurinterval IS NOT NULL THEN实际上应该是IF

于 2010-03-29T18:48:37.637 回答
0

我相信您需要在第一个 CASE 关键字之后添加“WHEN”。所以第一行的开头是:

UPDATE todo CASE WHEN recurinterval !=0 AND ...
于 2010-03-29T07:15:42.383 回答