【发布时间】:2016-07-04 10:08:50
【问题描述】:
我有一个 MySQL 语句,它使用 MySQL 变量,如“@StepWidth”和 IF 语句中使用的变量。
查询在 MySQL Workbench 中工作正常,但与 PHP 和 mysqli_query 一起使用时,带有变量的字段返回为空(null)。
想法是,将存储在数据库中的日期四舍五入到下一个分钟、小时或天,具体取决于 PHP 脚本设置的给定步长值,并按 unix_timestamp 对结果进行分组,即用这个计算得到一个小的结果,以便稍后在图表中使用。
查询
SELECT
@stepWidth:=900 as StepWidth,
task_template.puid,
task_template.ptemlate_name AS series_name,
round(avg(job.JOB_DURATION)) as value,
job.pcreation_date,
case
WHEN @stepWidth < 3600 THEN @RoundedCreationDate:=from_unixtime(UNIX_TIMESTAMP(job.pcreation_date) - MOD(UNIX_TIMESTAMP(job.pcreation_date), @stepWidth), "%Y-%m-%d %H:%i:%s")
WHEN @stepWidth >= 3600 AND @stepWidth < 86400 THEN @RoundedCreationDate:=DATE_ADD( DATE_FORMAT(job.pcreation_date, "%Y-%m-%d %H:00:00"), INTERVAL IF(MINUTE(job.pcreation_date) < 30, 0, 1) HOUR
)
WHEN @stepWidth >= 86400 then @RoundedCreationDate:=DATE_FORMAT(DATE_ADD( DATE_FORMAT(job.pcreation_date, "%Y-%m-%d %H:00:00"), INTERVAL IF(HOUR(job.pcreation_date) < 12, 0, 1) DAY ),"%Y-%m-%d 00:00:00" )
END AS RoundedCreationDate,
round(UNIX_TIMESTAMP(@RoundedCreationDate)) as start
FROM ( select @start := 0, @RoundedCreationDate := "1990-01-01" ) as Sqlvars, job
INNER JOIN task_template ON task_template.puid = job.rprocess_templateu
WHERE job.pcreation_date BETWEEN "2013-10-02 00:00:00" AND "2013-10-02 23:59:59"
GROUP BY task_template.puid,
task_template.ptemlate_name,"start"
ORDER BY task_template.ptemlate_name, "start";
我也尝试将结果写入临时表,但这会带来相同的结果。 我希望有人能帮助我。 非常感谢。
【问题讨论】:
-
与聚合函数一起使用时会话变量的行为是不可预测的。或者,首先使用会话变量准备结果,然后对这些结果应用聚合。还有read one of my question on so.
-
它是否可能仅仅因为您重用相同的连接并且您的变量已经具有以前尝试的值而在 Workbench 中工作?