Задавайте вопросы, мы ответим
Вы не зашли.
Столкнулся с задачей, знаю что есть много решений. Как оптимальнее?
Есть две таблицы: Авторы и Книги.
Надо выбрать всех авторов и вывести последнюю книгу для каждого из них.
Результатом должен быть список:
Уникальный автор, его id, id книги и её название.
Подскажите решение.
Неактивен
SELECT MAX(id), author_id FROM books GROUP BY 2
С ключиком на (author_id, id) может работать быстро и без денормализации.
Неактивен
paulus написал:
SELECT MAX(id), author_id FROM books GROUP BY 2
я так понимаю GROUP BY 2 синоним GROUP BY author_id
это понятный запрос.
значит итоговый запрос будет
Отредактированно AvtoNom (26.05.2011 15:47:29)
Неактивен
Ну, у Вас же id растут монотонно с датой. Если мое решение не нравится —
выбирайте MAX(date)
Если авторов 10, то надо развернуть — сначала искать авторов, а потом
уже для каждого искать книгу.
Неактивен
и как сделать что бы сначала нашли 10 авторов а только потом для них подобрать книги?
Неактивен
вот что получилось в моем реальном случае
причем во вложенном запросе ошибку выдавал SQL_CALC_FOUND_ROWS
Неактивен
максимум чего добился
Неактивен
А почему не написать простым зависимым запросом?
SELECT author.*, (SELECT name FROM books WHERE author_id = a.id ORDER BY date DESC LIMIT 1)
FROM authors a
ORDER BY name
LIMIT 10
Неактивен
большое спасибо. что то не подумал что так просто сработает! ))
Может кому то де пригодиться:
Неактивен
похожая задача обсуждалась здесь http://www.sql.ru/forum/actualthread.aspx?tid=593211
они там пишут о этом, не могу понять о чем:
select /*здесь придется перечислить все поля таблицы*/
from (
select *, @rn := if(@olddid = DeviceId, @rn + 1, 1) rn, @olddid := DeviceId
from table1, (select @olddid := -1, @rn := 0)t
order by DeviceId, Volume desc) t
where rn = 1
Неактивен