Как установить лимит для объединенной mysql таблицы? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь объединить данные из 3 таблиц с приведенным ниже запросом

SELECT `media_category`.id as cat_id,
        `media_category`.category_name as cat_name,
        `video`.`id` as vid_id,
        `video`.`name` as vid_name,
        `screenshots`.name as screenshot_name
        FROM `media_category`
        LEFT JOIN video
        ON `media_category`.id = `video`.`category_id`
        LEFT JOIN screenshots
        ON `video`.id = `screenshots`.`media_id`
        WHERE `screenshots`.name NOT LIKE '%\_%'

версия: mysql 5.7

Хорошо работает. Но мне нужно ограничить число строк, получаемых из таблицы video, до LIMIT 10 для категории

Есть идеи для этого?

1 Ответ

0 голосов
/ 28 апреля 2020

Вы не упоминаете, какую MySQL версию вы используете, поэтому я предполагаю, что это MySQL 8.x.

В MySQL 8.x вы можете использовать функцию DENSE_RANK() определить строки, которые вы хотите. Тогда простой предикат удалит те, которые вам не нужны.

Например, если мы хотим ограничить до 2 строк b для каждого a (независимо от строк в c), Вы можете сделать:

select *
from (
  select
    a.id,
    b.id as bid,
    dense_rank() over(partition by a.id order by b.id) as drank,
    c.id as cid
  from a
  left join b on b.aid = a.id
  left join c on c.bid = b.id
) x
where drank <= 2

Результат:

id  bid  drank     cid
--  ---  -----  ------
 1   11      1     100
 1   11      1     101
 1   11      1     102
 1   11      1     103
 1   12      2     120
 2   20      1     200
 2   20      1     201
 2   21      2     202
 3   30      1  <null>

Как видите, он показывает только 11 и 12 для идентификатора = 1, хотя всего их 5 строки для него (все пять имеют ранг 1 и 2). Вы можете увидеть запущенный пример на DB Fiddle . Сценарий данных для этого примера:

create table a (id int primary key not null);

insert into a (id) values (1), (2), (3);

create table b (id int primary key not null, aid int references a (id));

insert into b (id, aid) values
  (11, 1), (12, 1), (13, 1), (14, 1),
  (20, 2), (21, 2),
  (30, 3);

create table c (id int primary key not null, bid int references b (id));

insert into c (id, bid) values
  (100, 11), (101, 11), (102, 11), (103, 11),
  (120, 12), (130, 13), (140, 14),
  (200, 20), (201, 20),
  (202, 21);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...