SQL - предложение GROUP BY - PullRequest
       3

SQL - предложение GROUP BY

0 голосов
/ 17 октября 2018

У меня есть таблица, в которой мне были нужны последние 2 строки из каждой type записей.используя GROUP BY.

Например, из рисунка ниже я хочу получить последние 2 записи в зависимости от столбца date от каждого типа page.Я знаю, что GROUP BY будет использоваться, но я не совсем знаком с этим .. Спасибо

enter image description here

Ответы [ 4 ]

0 голосов
/ 17 октября 2018

Вы не можете использовать только GROUP BY, чтобы получить желаемый результат.Вы можете сделать это только с подзапросами и GROUP_CONCAT.Смотрите: Использование LIMIT в GROUP BY для получения N результатов по группе?

Если ваша версия MySQL не поддерживает эти функции, вам потребуется другой подход:

  1. Получите список всех типов страниц: SELECT DISTINCT page;
  2. Программно переберите список типов страниц и SELECT ... LIMIT 2; из основной таблицы

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

0 голосов
/ 17 октября 2018

вы можете использовать оконную функцию row_number, если ваша версия mysql 8+, но если ниже, то вы можете использовать метод генерации номера строки ниже

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

select x.*
from (
   select t.*,
      @num := if(@page= page, @num + 1, 1) as row_number,
      @page:= page as d
  from table t
  order by date desc
) as x where x.row_number <= 2;
0 голосов
/ 17 октября 2018

Короче говоря, если у вас так мало разных типов, вы можете использовать UNION-подход:

SELECT * FROM (SELECT * FROM table WHERE page = 'sometype' ORDER BY date limit 2) t
UNION ALL 
SELECT * FROM (SELECT * FROM table WHERE page = 'someothertype' ORDER BY date limit 2) t
UNION ALL 
SELECT * FROM (SELECT * FROM table WHERE page = 'otherothertype' ORDER BY date limit 2) t
...

Просто повторите это для каждого типа «страницы», который у вас есть.

ЕслиЭто решение не подходит вам, посмотрите на эту статью: http://www.sqlines.com/mysql/how-to/get_top_n_each_group

Приветствия

Nikao

0 голосов
/ 17 октября 2018

Вы можете использовать коррелированный подзапрос с предложением limit:

select t.*
from table t
where id in (select t1.id
             from table t1
             where t1.page = t.page
             order by t1.date desc
             limit 2
            );

Однако, только GROUP BY недостаточно для этого, вам может понадобиться JOIN.

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