2016-07-13 11 views
0

なぜこのクエリは$row['percentualeScarico'] = null(他の計算フィールドtotaleLiquidatototaleIncarichiRicevutitotaleIncarichiEvasi、okです)を返しますか?mysqlユーザ定義変数を持つPDOがnullを返す

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コンソールで同じクエリを実行しようとすると、すべてが問題ありません。

アレックスセッション変数は、MySQLがどのように扱われる

+0

なぜあなたは@totaleIncarichiEvasiと@ totaleIncarichiRicevutiを選択して、どうしたのか分かりませんか?なぜこれらの変数が設定されているコードを投稿しないのですか? –

+0

@totaleIncarichiRicevutiがゼロでないかどうかチェックしましたか?ゼロの場合、div-by-zeroが得られ、結果はnullになります。 –

+0

@YourCommonSense '@ totaleIncarichiEvasi'と' @ totaleIncarichiRicevuti'が正しくフェッチされました – alzambo

答えて

1

回で直感的な未満とすることができる、ありがとうございました。グループ化/集約を扱うときにはなく、句をまたいで使用することはお勧めしません(SELECTやWHERE、HAVINGなどではない)。

私の推測では、集計がそれらの変数に割り当てられる前に、MySQLはTRUNCATE((@totaleIncarichiEvasi/@totaleIncarichiRicevuti)*100,2)を計算していると思います。通常、選択は「左から右」で処理されますが、その計算では集計は行われないため、集計には他の集計されていない(グループ化されていない)フィールドとともに処理される可能性があります。 。


あなたが集計計算の重複を避けたい場合は、私が見つけた最も簡単な方法は、元のクエリに特異サブクエリを作成し、このように、外側のクエリで集計結果を使用することです。

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

おかげで、それは私が何をやったかです: 'totaleLiquidatoとして SUM(importoLiquidato)を選択 ( FROM percentualeScarico として totaleLiquidato、 totaleIncarichiRicevuti、 totaleIncarichiEvasi、 TRUNCATE((totaleIncarichiEvasi/totaleIncarichiRicevuti)* 100,2)を選択し、 COUNT(*)totaleIncarichiRicevutiとして、 SUM()1,0、dataRestituzioneがnullではない(もし)totaleIncarichiEvasi として LEFT JOINのincarico FROM COMPAGNIA ON incarico.idCompagnia = compagnia.id LEFTはincarico.idTipoEvento = EVENTO ON EVENTOを登録しよう.id)as subquery' – alzambo

関連する問題