0

我有一个带有嵌套选择的查询,它使用第一个选择的结果。当我使用 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 变量?

4

2 回答 2

2

好的,这有点奇怪,但是一旦我SET在单独的查询中首先(初始化)变量,生成的查询在 Laravel 中就可以正常工作。

这是我在前面的代码上方添加的代码:

$crons = DB::select(DB::raw('
    SET @quiet_crons = 0;
'));

也许有人可以解释为什么当 MySQL 只是做它的事情并且无论如何都可以工作时,它在 Laravel 中的工作方式......

于 2013-07-30T15:48:31.693 回答
1

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-30T15:43:03.723 回答