如何在mysql中正确设置prepare语句
当我设置以下sql并执行它们时。这些SQL已正确读取并存储到如何在mysql中正确设置prepare语句,mysql,sql,Mysql,Sql,当我设置以下sql并执行它们时。这些SQL已正确读取并存储到@myquery SELECT CONCAT("SELECT id ", ",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 3 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 3 DAY),"' ", ",coalesce( sum( IF( snapshot_da
@myquery
SELECT CONCAT("SELECT id ",
",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 3 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 3 DAY),"' ",
",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 2 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 2 DAY),"' ",
",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 1 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 1 DAY),"' ",
"FROM table",
"WHERE type in ('Daily') ",
"GROUP BY 1") INTO @myquery;
SELECT @myquery;
PREPARE stmt FROM @myquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
但是当PREPARE
语句时,返回以下错误
错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解第1行“in('Daily')groupby 1”附近使用的正确语法
这个问题的错误点是什么?这是否取决于其服务器版本
看来没有问题
如果有人有意见,请告诉我
谢谢表名和WHERE关键字之间没有空格:
"FROM table",
"WHERE type in ('Daily') ",
因此,将片段连接在一起后,您的查询将变成:
... FROM tableWHERE type in ('Daily') ...
MySQL会认为您有一个名为tableWHERE
的表,至少从语法的角度来看,这是可以的。它尚未检查此表是否存在
然后给它一个表别名type
,在语法上仍然可以
但是在中,表别名后面紧跟着,这让MySQL感到困惑。对于
谓词中的,这不是正确的位置
您可以通过以下方式解决此问题:
"FROM table ",
"WHERE type in ('Daily') ",
尝试对CONCAT
使用单引号,然后对IN
子句中的字符串文本转义单引号。此外,您应该只为别名提供文字名称
SELECT CONCAT('SELECT id',
'合并(总和(如果(快照日=日期(现在()-间隔3天),1,0))为现在的日减去日3',
'合并(总和(如果(snapshot_day=DATE(NOW()-INTERVAL 2 day),1,0))为NOW_减_2',
'合并(总和(如果(snapshot_day=DATE(NOW()-INTERVAL 1 day),1,0))为NOW_减_1',
“从表中”,
'其中键入('Daily'),
“分组依据1”)到@myquery中;
显示选择@myquery的输出代码>日期(现在()-间隔1天)
=当前日期-间隔1天