PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Exibir as mensagens mais recentes da tabela de mensagens, agrupar por usuário


Isso deve ser bastante eficiente:
SELECT u.name, sub.*
FROM  (
   SELECT DISTINCT ON (1)
          m.message_from AS user_id
        , m.message AS last_message
   FROM   users    u
   JOIN   messages m ON m.message_to = u.id
   WHERE  u.name = 'Paul'   -- must be unique
   ORDER  BY 1, m.id DESC
   ) sub
JOIN  users u ON sub.user_id = u.id;

Calcular todos os usuários com a mensagem mais recente na subconsulta sub usando DISTINCT ON . Em seguida, junte-se à tabela users uma segunda vez para resolver o nome.

Detalhes para DISTINCT ON :
Selecione a primeira linha em cada grupo GROUP BY?

À parte:Usar "id" e "name" como nomes de colunas não é uma convenção de nomenclatura muito útil.