Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL嵌套案例错误我需要帮助吗?_Php_Mysql_Linux_Nested_Case - Fatal编程技术网

Php MySQL嵌套案例错误我需要帮助吗?

Php MySQL嵌套案例错误我需要帮助吗?,php,mysql,linux,nested,case,Php,Mysql,Linux,Nested,Case,我在这里试图做的是:如果表todo中$done中标识的记录在列recurinterval中有一个值,那么重置日期\计划列,否则只需将这些记录的status\ id列设置为6 这是我从mysql_error()中得到的错误 您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解可在“CASE recurinterval!”附近使用的正确语法0且recurinterval不为空,则在第2行设置日期_sche' 我怎样才能使这句话起作用 UPDATE todo CASE recuri

我在这里试图做的是:如果表todo中$done中标识的记录在列recurinterval中有一个值,那么重置日期\计划列,否则只需将这些记录的status\ id列设置为6

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

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解可在“CASE recurinterval!”附近使用的正确语法0且recurinterval不为空,则在第2行设置日期_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

我认为您需要在第一个CASE关键字后添加'WHEN'。所以第一行的开头是:

UPDATE todo CASE WHEN recurinterval !=0 AND ...

我认为您需要在第一个CASE关键字后添加'WHEN'。所以第一行的开头是:

UPDATE todo CASE WHEN recurinterval !=0 AND ...

问题是,您正试图做一些afaik仅使用一个查询无法完成的事情。您希望根据recurinterval字段的值更新2列中的1列。所以基本上你应该把它分成两个查询,第一个就是你的ie

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)

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

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

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)

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

在我看来,您修改的语句中的第一个case
case recurinterval!=如果在我看来,您修改语句中的第一个case
case recurinterval!=如果

我尝试了您建议的方法,但出现了以下错误:您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在recurinterval!=0且Recurtinerval不为NULL,然后在第2行设置日期我尝试了您建议的方法,但出现了以下错误:您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在recurinterval!=0且recurinterval不为NULL,则在第2行设置日期。您建议的是我现在正在执行的操作。因为“WHERE todo_id IN($done)”是多余的,所以在我看来,这两个查询可以组合起来。我不知道如何实现Nick Gorbikoff关于使用IF进行流量控制的建议。你认为呢?用SQL来更新两个字段之一的流控制函数是不可能的。是的,要去的地方在。。。是相同的,但您也在使用Recurtinerval进行过滤,因此实际上您正在尝试一次更新两组不同的记录。您的建议就是我现在正在做的。因为“WHERE todo_id IN($done)”是多余的,所以在我看来,这两个查询可以组合起来。我不知道如何实现Nick Gorbikoff关于使用IF进行流量控制的建议。你认为呢?用SQL来更新两个字段之一的流控制函数是不可能的。是的,要去的地方在。。。是相同的,但您也在使用Recurtinerval进行筛选,因此实际上您正在尝试一次更新两组不同的记录。我就您的建议向wimvds答案发表了评论。我测试了是否收到mysql\u错误():查询为空。我的密码。“如果recurinterval!=0且recurinterval不为空,则更新todo,然后将日期\u计划=案例RecurRunit设置为“天”,然后将日期\u添加(日期\u计划,间隔recurinterval DAY)设置为“周”,然后将日期\u添加(日期\u计划,间隔recurinterval WEEK)设置为“月”,然后将日期\u添加(日期\u计划,间隔recurinterval MONTH)设置为“年”,然后将日期\u添加为“年”(date_scheduled,INTERVAL Recurtinerval YEAR)END WHERE todo_id IN($done)ELSE设置status_id=6 WHERE todo_id IN($done)END IF“;如果(Recurtinerval!=0且Recurtinerval不为NULL),也使用类似的括号,那么…我猜wimvds的回答是正确的。@AK-您使用了错误的IF语句。您应该使用这个:IF(…)-你把它和IF…END IF混淆了-它们是不同的IF语句-并且有不同的上下文和用法。对不起,我不清楚。好吧,我认为VMVDS的评论是正确的,因为它使代码更干净,如果其他人需要的话更容易阅读。现在我看了你的语句-我认为它是可能的你可以用IF(但你的陈述会被过分夸大)-您正在尝试计算一个字段并设置另一个字段-IF用于根据条件更新您正在尝试设置的字段。因此,您可以使用IF语句同时更新日期(而不是状态)id,而无需在IF语句中运行子查询-因此,我的投票是坚持VMVDS的sI对wimvds关于y的答案进行评论我们的建议。我测试了IF,但收到了mysql\u error():查询为空。我的代码。“如果recurinterval!=0且recurinterval不为空,则更新todo,然后设置日期\u scheduled=CASE recurunit当'DAY'时,然后在'WEEK'时添加日期(日期\u scheduled,间隔recurinterval DAY),然后添加日期(日期\u scheduled,间隔recurinterval WEEK)当“月”和“日期”添加(计划日期,间隔周期月)时,当“年”和“日期”添加(计划日期,间隔周期年)结束时,在($done)中设置todo_id