(no subject)
Friday, October 16th, 2009 13:26CREATE 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)no subject
Date: Friday, October 16th, 2009 11:21 am (UTC)no subject
Date: Friday, October 16th, 2009 02:03 pm (UTC)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);
no subject
Date: Friday, October 16th, 2009 02:05 pm (UTC)no subject
Date: Friday, October 16th, 2009 02:30 pm (UTC)b1.author в "group by" лишний.
no subject
Date: Friday, October 16th, 2009 02:05 pm (UTC)no subject
Date: Friday, October 16th, 2009 11:07 am (UTC)не?
no subject
Date: Friday, October 16th, 2009 11:19 am (UTC)no subject
Date: Friday, October 16th, 2009 11:21 am (UTC)Как бы теперь сделать запрос менее громоздким...
no subject
Date: Friday, October 16th, 2009 11:21 am (UTC)SELECT * FROM book_reverse GROUP BY author;
no subject
Date: Friday, October 16th, 2009 11:22 am (UTC)no subject
Date: Friday, October 16th, 2009 11:26 am (UTC)Баянистое.
Date: Friday, October 16th, 2009 11:39 am (UTC)Я тут подозреваю что ты пытаешься решить какую-то определенную задачу.
no subject
Date: Friday, October 16th, 2009 11:43 am (UTC)Задача очень близка к реальности, кстати.
no subject
Date: Friday, October 16th, 2009 12:06 pm (UTC)А то строки 2 и 5 получить можно и так: SELECT * FROM books WHERE id IN (2,5)
no subject
Date: Friday, October 16th, 2009 12:13 pm (UTC)Без вложенного запроса вряд ли получится, выше в комментах есть работающий вариант.
no subject
Date: Friday, October 16th, 2009 12:25 pm (UTC)работающий вариант это этот? http://kastaneda.livejournal.com/207905.html?thread=2198305#t2198305
он может и работает, но неправильное, а правильное, как всегда, в документации
http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html
no subject
Date: Friday, October 16th, 2009 01:14 pm (UTC)Ух ты. Это… изящно.
no subject
Date: Saturday, October 17th, 2009 02:16 am (UTC)no subject
Date: Monday, November 30th, 2009 04:51 pm (UTC)no subject
Date: Monday, November 30th, 2009 07:19 pm (UTC)no subject
Date: Tuesday, December 1st, 2009 08:51 am (UTC)Ага! Тогда я тебя знаю.
no subject
Date: Tuesday, December 1st, 2009 09:35 am (UTC)т.е. я учился с тобой, но не в физмате, а в кубике.
no subject
Date: Saturday, October 17th, 2009 02:28 am (UTC)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)
Я знаю, как. Но логика не совсем очевидна.
no subject
Date: Saturday, October 17th, 2009 05:51 am (UTC)no subject
Date: Saturday, October 17th, 2009 04:22 pm (UTC)