即使存在可用值,MySQL MAX也会返回null

时间:2017-08-18 19:45:13

标签: mysql sql aggregate aggregate-functions

我正在开发一个MySQL 5.7数据库,而且我在最近做了一个有点大的查询时遇到了一些麻烦,深入研究了一下,我发现某个特定的部分不是&#39 ; t按预期运行。我做了一些测试,发现了一些奇怪的事情。

该部分如下(对于特定场景,数字必须是硬编码的,但通常是来自另一个表的值):

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]。第二个空值除外,但不是第一个也不是第三个。 真正令我害怕的是,如果我删除了第一个属性上的MAX,则会正确返回dataAtualizacao,并且值为非NULL值。

即使存在要聚合的值,MAX怎么可能返回null?我在这里错过了什么吗?

亲切的问候

修改

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

1 个答案:

答案 0 :(得分:0)

您可以尝试使用count(),因为它总会返回一些值,或者您也可以尝试COALSEC函数。

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