(no subject)

Friday, October 16th, 2009 13:26
kastaneda: (Default)
[personal profile] kastaneda
CREATE TABLE books (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  author varchar(20) NOT NULL,
  book varchar(30) NOT NULL,
  published year(4) NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO books (id, author, book, published) VALUES
(1, 'John R. R. Tolkien', 'The Hobbit', 1937),
(2, 'John R. R. Tolkien', 'The Lord of the Rings', 1955),
(3, 'Terry Pratchett', 'The Colour of Magic', 1983),
(4, 'Terry Pratchett', 'Equal Rites', 1987),
(5, 'Terry Pratchett', 'The Truth', 2000);
SELECT * FROM books GROUP BY author возвращает строки 1 и 3.
Как получить строки 2 и 5?

Похоже, у меня пятница настала раньше времени, мозги не варят. ORDER BY published DESC тут несколько неуместен, поскольку сортирует уже сгруппированные записи. Пока придумал только вот такое: SELECT * FROM books WHERE id IN (SELECT MAX(id) FROM books GROUP BY author) — это грязный хак, записи могут идти не по порядку. Да и вообще, делать вложенный запрос ради такой ерунды…

Есть идеи?

Upd.: раз уж сегодня пятница, давайте соберём побольше альтернативных решений.
Чем монстрообразнее — тем лучше :)

Взбульк.

Date: Friday, October 16th, 2009 10:57 am (UTC)
From: [identity profile] fester-ua.livejournal.com
Можно странноjoin на сам себя.

Date: Friday, October 16th, 2009 02:03 pm (UTC)
From: [identity profile] gul-kiev.livejournal.com
Например, так:
select b1.id, author, b1.book, b1.published from books as b1 join books as b2 using (author) group by b1.id, b1.author having b1.id = max(b2.id);

Date: Friday, October 16th, 2009 02:30 pm (UTC)
From: [identity profile] gul-kiev.livejournal.com
btw, группировать достаточно по b1.id.
b1.author в "group by" лишний.

Date: Friday, October 16th, 2009 11:07 am (UTC)
From: [identity profile] bo-dun.livejournal.com
SELECT трампарампампам FROM (SELECT трампарампампам ORDER BY published DESC) GROUP BY author;

не?

Date: Friday, October 16th, 2009 11:21 am (UTC)
From: [identity profile] diggya.livejournal.com
create view book_reverse as select * from books order by id desc;
SELECT * FROM book_reverse GROUP BY author;

Date: Friday, October 16th, 2009 11:26 am (UTC)
From: [identity profile] 0ld.livejournal.com
и получаем те же 1 и 3 только в обратном порядке :)

Баянистое.

Date: Friday, October 16th, 2009 11:39 am (UTC)
From: [identity profile] diggya.livejournal.com
SELECT id, author, book, max(published) FROM `books` group by author;

Я тут подозреваю что ты пытаешься решить какую-то определенную задачу.

Date: Friday, October 16th, 2009 12:06 pm (UTC)
From: [identity profile] unbe.livejournal.com
Использовать group by без агрегатных функций немного странно. Что нужно получить, последнюю книгу автора?
А то строки 2 и 5 получить можно и так: SELECT * FROM books WHERE id IN (2,5)

Date: Friday, October 16th, 2009 12:25 pm (UTC)
From: [identity profile] unbe.livejournal.com
вложенный запрос действительно нужен, хотя на оракле возможно удастся и без.
работающий вариант это этот? http://kastaneda.livejournal.com/207905.html?thread=2198305#t2198305
он может и работает, но неправильное, а правильное, как всегда, в документации
http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

Date: Saturday, October 17th, 2009 02:16 am (UTC)
From: [identity profile] zmeuka.livejournal.com
грмм. косяк будет, если разные авторы публиковались в одинаковые годы.

Date: Monday, November 30th, 2009 07:19 pm (UTC)
From: [identity profile] unbe.livejournal.com
дык, учился

Date: Tuesday, December 1st, 2009 09:35 am (UTC)
From: [identity profile] unbe.livejournal.com
а ваще нет, не учился :)
т.е. я учился с тобой, но не в физмате, а в кубике.

Date: Saturday, October 17th, 2009 02:28 am (UTC)
From: [identity profile] zmeuka.livejournal.com
Ну раз ты попросил пятничного монстра, то теперь ломай голову, как это работает:

select a1.id, a1.author, a1.book, a1.published from books a1 left join books a2 on a1.author=a2.author and a1.published < a2.published where a2.id is null;

+----+--------------------+-----------------------+-----------+
| id | author | book | published |
+----+--------------------+-----------------------+-----------+
| 2 | John R. R. Tolkien | The Lord of the Rings | 1955 |
| 5 | Terry Pratchett | The Truth | 2000 |
+----+--------------------+-----------------------+-----------+
2 rows in set (0.00 sec)

Я знаю, как. Но логика не совсем очевидна.

Date: Saturday, October 17th, 2009 05:51 am (UTC)
From: [identity profile] fester-ua.livejournal.com
Бугагирую. Изящно :)

September 2025

M T W T F S S
12345 67
891011121314
15161718192021
22232425262728
2930