在MySQL中使用SELECT和SUB SELECT

时间:2018-05-22 11:38:48

标签: mysql sql

我有一个关于SQL的问题,我从未使用过select sub而且最终迷失了它。

Meu SQL:

    SELECT CLI.id, CLI.nome, CLI.senha, CLI.email, CLI.cpf, CLI.celular, CLI.data_nasc, CLI.genero, CLI.data_cadastro, CLI.status, CLI.id_socket, ATEN.mensagem, ARQ.nome AS foto, ATEN.data_mensagem
FROM ut_clientes AS CLI
LEFT JOIN ut_arquivos AS ARQ ON (ARQ.id_tipo = CLI.id AND ARQ.tipo = "ut_clientes")
INNER JOIN ut_atendimentos AS ATEN ON (ATEN.id_usuario_envio = CLI.id)
WHERE ATEN.id_usuario_envio != 59163 
GROUP BY CLI.id 
ORDER BY ATEN.data_mensagem
DESC

嗯,我想要做的是根据客户ID对消息进行分组,并根据data_mensagem仅记录数据库中记录的最后一条消息。

我尝试过多种方式,但显示的最后一个是第一条插入数据库的消息。

如果有人能帮助我,我会感激不尽。谢谢你们!

1 个答案:

答案 0 :(得分:0)

这可能会帮助你...我正在使用联接进行预查询(PQ别名)。此查询仅转到您的消息并根据MAX()获取客户端ID和最新消息。通过在此处执行该组,每个客户端最多将返回1条记录。我还有WHERE子句来排除你列出的一个ID。

从这个结果中,您可以简单地连接到查询的其余部分。

SELECT 
      CLI.id, 
      CLI.nome, 
      CLI.senha, 
      CLI.email, 
      CLI.cpf, 
      CLI.celular, 
      CLI.data_nasc, 
      CLI.genero, 
      CLI.data_cadastro, 
      CLI.status, 
      CLI.id_socket, 
      ATEN.mensagem, 
      ARQ.nome AS foto, 
      PQ.data_mensagem
   FROM 
      ut_clientes AS CLI
         LEFT JOIN ut_arquivos AS ARQ 
            ON CLI.id = ARQ.id_tipo 
            AND ARQ.tipo = "ut_clientes"
         INNER JOIN
         ( select 
                 ATEN.id_usuario_envio,
                 MAX( ATEN.data_mensagem ) as MostRecentMsg
              from 
                 ut_atendimentos AS ATEN
              where
                 ATEN.id_usuario_envio != 59163 
              group by
                  ATEN.id_usuario_envio ) PQ
           ON CLI.id = PQ.id_usuario_envio
   GROUP BY 
      CLI.id 
   ORDER BY 
      PQ.data_mensagem DESC