2017-08-18 3 views
0

私はMySQL 5.7データベースで作業していますが、最近私が最近作成したやや大きな質問に問題があります。特定のセクションが期待どおりに実行されていないことを示します。私はいくつかのテストを行い、何か変わったことが起こっていることを発見した。次のように利用可能な値があるにもかかわらず、MySQL MAXがnullを返す

部(数字はハード特定のシナリオのために符号化されなければならなかったが、通常は別のテーブルからの値)である。

SELECT 
    MAX(cp.dataAtualizacao) dataAtualizacao, 
    MAX(m.dataRegistro) dataRegistro, 
    CASE WHEN MAX(cp.dataAtualizacao) > MAX(COALESCE (m.dataRegistro, cp.dataAtualizacao)) THEN MAX(cp.dataAtualizacao) ELSE MAX(COALESCE (m.dataRegistro, cp.dataAtualizacao)) END data 
FROM MadeiraNegocio cp   
    LEFT JOIN MadeiraConversaNegocio c ON (cp.id = c.idNegocioOriginal OR cp.id = c.idNegocioResposta) 
    LEFT JOIN MadeiraMensagemConversaNegocio m ON c.id = m.idConversa 
WHERE cp.id = 959 AND ((cp.id = c.idNegocioOriginal AND 960 = c.idNegocioResposta) OR (960 = c.idNegocioOriginal AND cp.id = c.idNegocioResposta)) AND 
    (cp.id = 959 OR 960 = cp.idNegocioOriginal) AND (m.idAutor != 4370 OR m.idAutor IS NULL) 

、このクエリが返すように[NULL、NULL、NULL ]。 2番目のヌルは除外されましたが、最初と3番目のヌルは除外されませんでした 本当に私を驚かせるのは、最初の属性でMAXを削除すると、NULL値ではなくdataAtualizacaoが正しく返されるということです。

集計する値があるにもかかわらず、MAXがnullを返すのはどうでしょうか?私はここに何かを逃していますか

種類に関して

EDIT

MadeiraNegocio表:

id dataRegistro idNegocioOriginal cancelado dataAtualizacao dataVisualizacao  
959 2017-08-18 11:28:58 null 0 2017-08-18 15:38:16 2017-08-18 16:00:23 

MadeiraConversaNegocio表:

id idNegocioOriginal idNegocioResposta dataVisualizacaoOriginal dataVisualizacaoResposta 
288 959 960 2017-08-18 14:54:10 2017-08-18 17:34:17 

MadeiraMensagemConversaNegocio

id idConversa idAutor mensagem dataRegistro 
229 288 4370 sometext 2017-08-18 16:25:02 
+0

MAXをCOUNTに置き換えるとどうなりますか? – kbball

+0

これは0を返し、select文全体を "SELECT *"に置き換えても、どちらの項目も返しません。有効なタイムスタンプが返されるテーブルと列を指定するとどうなりますか? –

+0

それ以外のクエリやデータを参照する必要がありますか? – kbball

答えて

0

常に値を返すようにcount()を試してみるか、COALSEC関数を試すこともできます。

select count(field1) from table where id = 1 ; 
+0

COUNTは何らかの理由で0を返します。私に値を与えます。テーブル内のすべての列を選択すると、何も入力せずに戻ります。 –

関連する問題