为什么此查询返回$row['percentualeScarico'] = null
(其他计算字段totaleLiquidato
,totaleIncarichiRicevuti
,totaleIncarichiEvasi
,还可以)?
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控制台中执行相同的查询,一切正常。
谢谢
亚历
答案 0 :(得分:1)
MySQL如何处理会话变量有时可能不那么直观。我建议不要在子句中使用它们(例如,不在SELECT和WHERE中,或者在同一查询中使用HAVING等),而不是在处理分组/聚合时。
我的猜测是,在将聚合分配给这些变量之前,MySQL正在计算TRUNCATE((@totaleIncarichiEvasi/@totaleIncarichiRicevuti)*100,2)
。通常,选择是从"从左到右"处理的,但由于它自己的计算不涉及聚合,因此很可能与其他非聚合(和非分组)字段一起处理,在聚合之前使用第一个值"找到"。
如果你想避免重复聚合计算,我发现的最简单的方法是使原始查询成为单个子查询,并以这种方式在外部查询中使用聚合结果:
SELECT q.*, [calculation using aggregate field(s)]
FROM ([original query]) AS q