我有一个使用第一个select结果的嵌套select查询。在使用Sequel Pro的查询检查器进行测试时,我让查询工作得很好。它返回我想要的结果。当我将此查询传递给Laravel并使用简单的echo
语句对其运行测试时,它会输出NULL
。
下面是我的PHP代码和查询:
$crons = DB::select('
SELECT @quiet_crons:=ROUND(SUM(TIME_TO_SEC(TIMEDIFF(`end_time`, `start_time`))/60/15))
AS quiet_crons,
FLOOR(SUM(TIME_TO_SEC(TIMEDIFF(TIME('24:00'), TIME(NOW())))/60/15-@quiet_crons))
AS remaining_crons
FROM `quiet_periods`
WHERE `day` = DAYNAME(NOW())
');
这是控制台的输出:
array(1) {
[0]=>
object(stdClass)#689 (2) {
["quiet_crons"]=>
string(2) "24"
["remaining_crons"]=>
NULL
}
}
remaining_crons
的结果不应该是NULL
。
请注意:我在这里看到了一篇关于Laravel中用户定义的MySQL变量的文章,我尝试了这个解决方案,但它并没有解决我的问题。这是我指的链接:在Laravel 3中用户定义的MySQL变量?
发布于 2013-07-30 15:43:03
MySQL用户定义的变量有点棘手。来自手册;
作为一般规则,除了在SET语句中,不应该将值赋值给用户变量并读取相同语句中的值。例如,要增加一个变量,这是可以的: 设置为a= @a + 1; 对于其他语句,如SELECT,,您可能会得到预期的结果,但这并不一定是。在下面的语句中,您可能认为MySQL将首先计算@a,然后再执行赋值: ..。
但是,您可以不使用变量重写语句;
SELECT quiet_crons,
FLOOR(SUM(TIME_TO_SEC(TIMEDIFF(TIME('24:00'), TIME(NOW())))/60/15-quiet_crons))
AS remaining_crons
FROM (
SELECT ROUND(SUM(TIME_TO_SEC(TIMEDIFF(`end_time`, `start_time`))/60/15))
AS quiet_crons
FROM `quiet_periods`
WHERE `day` = DAYNAME(NOW())
) a;
一个要测试的SQfiddle。
发布于 2013-07-30 15:48:31
好吧,这有点奇怪,但是一旦我在单独的查询中首先初始化了变量,结果的查询在Laravel中就能正常工作了。
下面是我在前面的代码中添加的代码:
$crons = DB::select(DB::raw('
SET @quiet_crons = 0;
'));
也许有人可以解释为什么在拉拉维尔这样的工作,而MySQL只是做了它的事情和工作无论如何.
https://stackoverflow.com/questions/17950953
复制相似问题