0

我正在尝试将 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每个类别的行

有什么想法吗?

4

1 回答 1

1

你没有提到你使用的是哪个 MySQL 版本,所以我假设它是 MySQL 8.x。

在 MySQL 8.x 中,您可以使用该DENSE_RANK()函数来识别您想要的行。然后一个简单的谓词将删除您不想要的谓词。

例如,如果我们想限制b每行 2 行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>

正如您所看到的,它仅显示11id 12= 1,即使它总共有 5 行(所有 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);
于 2020-04-28T20:19:24.123 回答