Есть авторы материалов.
У каждого автора есть по несколько записей.
Необходимо составить запрос, чтобы для каждого автора было выбрано по n записи (если их меньше — то сколько есть).
Как это сделать в несколько запросов я знаю, но в один никак не получается.
Думал в сторону GROUP_CONCAT, но на него нельзя наложить условие в ограничение количества выбираемых элементов. Возможно ли это вообще?
Всем спасибо за помощь!
Иногда бывает эффективнее заранее пронумеровать записи пользователей в отдельном поле (однократно старые данные и затем при добавлении и удалении записей заново перенумеровывать), тогда запрос станет очень простым:
rPman, это иногда будет эффективнее ровно в одном случае: если все авторы пишут строго по порядку, друг за другом, не более одной записи за раз. Что будет, если у нас 3 автора, нам нужно выбрать по 5 записей каждого, но один из авторов у нас пишет по 20 статей в день, а два других раз в неделю пишут? Тогда мы получим 15 последних записей одного и того же автора.
Плюс вы и пример SQL-запроса привели неправильный, правильно исходя из вашего алгоритма должно быть:
SELECT * FROM статьи t ORDER BY t.номер DESC LIMIT :limit;
ruskar, нумеровать можно по разному. Можно пронумеровать и в разрезе автора. Когда автор добавляет статью — перенумеровать все его статьи, т.е. порядковый номер при таком подходе будет уникален лишь в разрезе автора. Думаю это и имел в виду rPman. И запрос его изменять не надо. Вы просто не уловили мысль.
ruskar, ошибки в моем запросе нет, ты неверно понял идею.
При добавлении статьи ей присваивается номер равный +1 к номеру его последней (если статей не было то 0). При удалении статьи все номера для статей автора после удаляемой уменьшаются на 1.
p.s. Основная идея (ее почти всегда можно применять) — если запрос на чтение медленный, посчитаем его (или его часть) заранее во время записи.