【问题标题】:How to set limit for joined mysql table?如何为加入的mysql表设置限制?
【发布时间】:2020-04-28 19:39:21
【问题描述】:

我正在尝试将 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

有什么想法吗?

【问题讨论】:

  • 预期结果是什么?每个类别 10 个视频,还是总共 10 个视频?
  • @josh.trow 每个类别 10 个视频
  • 您可以在这里找到答案stackoverflow.com/questions/2129693/…
  • 您的左外连接无法正常工作,因为您在 WHERE 子句中有谓词。它们被静默转换为 INNER 连接。

标签: node.js mysql-5.7 node-mysql2


【解决方案1】:

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

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

例如,如果我们想在每个 a 上限制为 2 行 b(与 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>

正如您所看到的,它仅显示 id = 1 的 1112,即使它总共有 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);

【讨论】:

  • 我将问题标签更改为 MySQL-5.7。不幸的是,这是一种完全不同的动物。正如你所说,这个解决方案在那里行不通。
猜你喜欢
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
相关资源
最近更新 更多