我有一个嵌套选择的查询,它使用第一个选择的结果。当我使用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变量,我尝试了解决方案,但它没有解决我的问题。这是我所指的链接: User-defined MySQL variables in Laravel 3?
答案 0 :(得分:1)
MySQL用户定义的变量有点棘手。来自the manual;
作为一般规则,除了SET语句 之外,您不应该为用户变量赋值并在同一语句中读取值 。例如,要增加变量,这没关系:
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;
答案 1 :(得分:1)
好的,这有点奇怪,但只要我SET
(初始化)变量首先在一个单独的查询中,结果查询在Laravel中工作正常。
这是我在上一段代码上面添加的代码:
$crons = DB::select(DB::raw('
SET @quiet_crons = 0;
'));
也许有人可以解释为什么这会像Laravel那样工作,当MySQL正确地做它的事情并且无论如何都有效...