У меня есть следующая схема:
CREATE TABLE author (
id integer
, name varchar(255)
);
CREATE TABLE book (
id integer
, author_id integer
, title varchar(255)
, rating integer
);
И я хочу, чтобы каждый автор с его последней книгой:
SELECT book.id, author.id, author.name, book.title as last_book
FROM author
JOIN book book ON book.author_id = author.id
GROUP BY author.id
ORDER BY book.id ASC
По-видимому, вы можете сделать это в mysql: Присоединить две таблицы в MySQL, возвращая только одну строку из второй таблицы.
Но postgres дает эту ошибку:
ОШИБКА: столбец "book.id" должен появиться в предложении GROUP BY или использоваться в совокупной функции: SELECT book.id, author.id, author.name, book.title как last_book FROM автор JOIN book book ON book.author_id = author.id GROUP BY author.id ORDER BY book.id ASC
Когда присутствует GROUP BY, это недействительно для списка SELECT выражения для ссылки на негруппированные столбцы, кроме как в совокупности функций, поскольку было бы возвращено более чем одно возможное значение для негруппового столбца.
Как я могу указать postgres: "Дайте мне только последнюю строку, если она упорядочена по joined_table.id
, в объединенной таблице?"
Изменить: С этими данными:
INSERT INTO author (id, name) VALUES
(1, 'Bob')
, (2, 'David')
, (3, 'John');
INSERT INTO book (id, author_id, title, rating) VALUES
(1, 1, '1st book from bob', 5)
, (2, 1, '2nd book from bob', 6)
, (3, 1, '3rd book from bob', 7)
, (4, 2, '1st book from David', 6)
, (5, 2, '2nd book from David', 6);
Я должен видеть:
book_id author_id name last_book
3 1 "Bob" "3rd book from bob"
5 2 "David" "2nd book from David"