MySQL Выберите последние 3 записи в группе - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть 2 таблицы news и news_category, к которым они могут присоединиться news.category_id = news_category.id

Я хочу получить все news_category строки и получить 3 последних строки изновости для каждого category id


спасибо сильный текст за помощь

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

К сожалению, ответ Джейкоба не гарантируется, независимо от того, что говорится в ссылке.Проблема в том, что MySQL не гарантирует порядок вычисления выражений в SELECT.Следовательно, вам не следует присваивать переменную в одном выражении, а затем использовать ее в другом.Поведение может измениться.

Кроме того, более поздние версии MySQL более требовательны при использовании переменных с group by и order by, поэтому требуется дополнительный подзапрос.

Запрос выполняетне нужно group by.Вы должны делать это с order by:

select n.id, n.title
from (select n.*,
             (@rn := if(@c = category_id, @rn + 1,
                        if(@c := category_id, 1, 1)
                       )
             ) as rn
      from (select n.*
            from news n
            order by n.category_id, n.id desc, n.title
           ) n cross join
           (select @rn := 0, @c := -1) params
     ) n
where n.rn <= 3;
0 голосов
/ 29 декабря 2018

Барон Шварц хорошо объяснил эту проблему в ССЫЛКА

Ниже основан на его методе.Вы можете попробовать это сами в db-fiddle. db-fiddle , я создал упрощенную схему, чтобы показать ее.

set @num := 0, @category_id := '';

select t.id, t.title
from (
  select category_id, id, title,
        @num := if(@category_id = category_id, @num + 1, 1) as row_number,
        @category_id := category_id as dummy
  from news
  group by category_id, id, title
) t
where t.row_number <= 3

Обновление

Как упомянуто Гордоном Линоффом ниже, этот ответне гарантируется работа.Это также хорошо объяснено в ссылочном блоге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...