To by mělo být poměrně efektivní:
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;
Vypočítejte všechny uživatele s nejnovější zprávou v dílčím dotazu sub
pomocí DISTINCT ON
. Poté se připojte k celkovému počtu users
podruhé k vyřešení názvu.
Podrobnosti pro DISTINCT ON
:
Vybrat první řádek v každé skupině GROUP BY?
Stranou:Použití „id“ a „name“ jako názvů sloupců není příliš užitečná konvence pojmenování.