带有mysql用户定义变量的PDO返回null

时间:2016-07-13 15:56:35

标签: php mysql pdo

为什么此查询返回$row['percentualeScarico'] = null(其他计算字段totaleLiquidatototaleIncarichiRicevutitotaleIncarichiEvasi,还可以)?

SELECT 
    SUM(importoLiquidato) as totaleLiquidato,
    @totaleIncarichiRicevuti := COUNT(*) as totaleIncarichiRicevuti,
    @totaleIncarichiEvasi := SUM(if(dataRestituzione IS NOT null,1,0)) as totaleIncarichiEvasi,
    TRUNCATE((@totaleIncarichiEvasi/@totaleIncarichiRicevuti)*100,2) as percentualeScarico
FROM incarico
LEFT JOIN compagnia ON incarico.idCompagnia = compagnia.id
LEFT JOIN evento ON incarico.idTipoEvento = evento.id
WHERE (dataIncarico BETWEEN :daDataIncarico AND :aDataIncarico)

$stmt = $this->conn->prepare( $query )

[here I do the bindings]

$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

如果我尝试在phpstorm sql控制台中执行相同的查询,一切正常。

谢谢

亚历

1 个答案:

答案 0 :(得分:1)

MySQL如何处理会话变量有时可能不那么直观。我建议不要在子句中使用它们(例如,不在SELECT和WHERE中,或者在同一查询中使用HAVING等),而不是在处理分组/聚合时。

我的猜测是,在将聚合分配给这些变量之前,MySQL正在计算TRUNCATE((@totaleIncarichiEvasi/@totaleIncarichiRicevuti)*100,2)。通常,选择是从"从左到右"处理的,但由于它自己的计算不涉及聚合,因此很可能与其他非聚合(和非分组)字段一起处理,在聚合之前使用第一个值"找到"。

如果你想避免重复聚合计算,我发现的最简单的方法是使原始查询成为单个子查询,并以这种方式在外部查询中使用聚合结果:

SELECT q.*, [calculation using aggregate field(s)]
FROM ([original query]) AS q