2015-07-21 156 views
1

下面的SQL在phpmyadmin中执行时会以intented方式工作,但是当我尝试在我的PHP脚本中执行时,它会引发异常。语法错误或访问冲突

$log_stats = DB::select(DB::raw(" 
     SET @startDate = '$from'; 
     SET @endDate = '$db_to'; 
     SET @total_duration = (CAST(@endDate as DATETIME) - CAST(@startDate as DATETIME)); 

     SELECT t1.status 
      ,SUM(IF(t2.cron_ran_at IS NULL OR t2.cron_ran_at > @endDate, 
      CAST(@endDate AS DATETIME), 
      t2.cron_ran_at) - 
     IF(t1.cron_ran_at < @startDate, 
      CAST(@startDate AS DATETIME), 
      t1.cron_ran_at))/@total_duration as duration 
     FROM monitor_logs t1 
     LEFT JOIN monitor_logs t2 ON t1.id = (t2.id - 1) 
     WHERE (t2.cron_ran_at > @startDate OR t2.cron_ran_at IS NULL) AND t1.cron_ran_at < @endDate 
     GROUP BY t1.status 
")); 

抛出异常......

SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以在'SET @endDate ='2015-07-22 00:00:00'附近使用正确的语法; SET @total_duration =(CAST(@endDate'at line 2(SQL:SET @startDate ='2015-07-14 00:00:00'; SET @endDate ='2015-07-22 00:00:00'; SET @total_duration =(CAST(@endDate as DATETIME) - CAST(@startDate as DATETIME)); SELECT t1.status,SUM(IF(t2.cron_ran_at IS NULL or t2.cron_ran_at> @endDate,CAST(@endDate AS DATETIME ),t2.cron_ran_at) - IF(t1.cron_ran_at < @startDate,CAST(@startDate AS DATETIME),t1.cron_ran_at))/ @total_duration作为持续时间FROM monitor_logs t1 LEFT JOIN monitor_logs t2 ON t1.id =(t2.id - 1),其中(t2.cron_ran_at> @startDate或t2.cron_ran_at IS NULL)AND t1.cron_ran_at < @EndDate GROUP BY t1.status)`

+1

使SQL变量成为PHP变量。 – chris85

回答

1

你不能在一个查询中运行多个MySQL语句PHP。你应该把它作为一个存储过程或者函数。