select distinct on (author.id)
book.id, author.id, author.name, book.title as last_book
from
author
inner join
book on book.author_id = author.id
order by author.id, book.id desc
Kiểm tra distinct on
Với sự khác biệt, cần phải bao gồm các cột "khác biệt" theo thứ tự order by
. Nếu đó không phải là thứ tự bạn muốn thì bạn cần kết thúc truy vấn và sắp xếp lại
select
*
from (
select distinct on (author.id)
book.id, author.id, author.name, book.title as last_book
from
author
inner join
book on book.author_id = author.id
order by author.id, book.id desc
) authors_with_first_book
order by authors_with_first_book.name
Một giải pháp khác là sử dụng một hàm cửa sổ như trong câu trả lời của Lennart. Và một cái khác rất chung chung là cái này
select
book.id, author.id, author.name, book.title as last_book
from
book
inner join
(
select author.id as author_id, max(book.id) as book_id
from
author
inner join
book on author.id = book.author_id
group by author.id
) s
on s.book_id = book.id
inner join
author on book.author_id = author.id