【问题标题】:Limit and offset (pagination) for rows with related data (with joins)具有相关数据(带连接)的行的限制和偏移(分页)
【发布时间】:2021-11-01 18:52:51
【问题描述】:

我有表 AlphaBetaBeta 属于 Alpha

create table Alpha
(
    id int auto_increment primary key
);

create table Beta
(
    id         int auto_increment primary key,
    alphaId    int null,
    orderValue int,
    constraint Alpha_ibfk_1 foreign key (alphaId) references Alpha (id)
);

以下是一些测试记录:

insert into Alpha (id) values (1);
insert into Alpha (id) values (2);
insert into Beta (id, alphaId, orderValue) values (1, 1, 23);
insert into Beta (id, alphaId, orderValue) values (2, 1, 43);
insert into Beta (id, alphaId, orderValue) values (3, 2, 73);

我想为他们创建一个分页,这在我的应用程序逻辑方面是有意义的。所以当我设置limit 2时,例如,我期望得到两个Alpha记录及其相关记录的列表,但实际上当我设置limit 2时:

    select *
from Alpha
      inner join Beta on Alpha.id = Beta.alphaId
order by Beta.orderValue
limit 2;

结果我只有一个 Alpha 记录及其相关数据:

虽然我想为我的 LIMIT 构造找出一种方法,以仅计算 Alpha 记录的唯一出现次数并返回如下内容:

可以在 MySQL 中一次查询吗?也许不同的RDBMS?还是只选择多个查询?

=== 编辑

这样要求的原因是我想创建一个带有分页功能的 API,它返回 Alpha 记录及其相关的 Beta 记录。问题是从用户的角度来看,限制的工作方式没有意义:"Hey, I said I want 2 records of Alpha with its related data, not 1. What is that?"

【问题讨论】:

  • ...JOIN 就是这样工作的。预期的结果是什么?
  • 想要的结果如图2所示,实际结果如图1所示。
  • 你确定alphaId应该指向表beta吗?
  • LIMIT-ing 没有ORDER-ing 很少有意义。
  • 感谢您的关注,我已添加订购并修复了references 问题。

标签: mysql sql


【解决方案1】:

你的例子有几个问题:

  • 您的外键似乎建立错误。
  • 限制绝大多数需要明确的行顺序。否则结果将不稳定且不可重现。

无论如何,话虽如此,您可以对表Alpha 的行进行限制,然后对表Beta 执行联接。

例如:

select *
from (
  select * 
  from Alpha
  order by id
  limit 2 -- this limit only affects table Alpha
) x
join Beta b on b.alphaId = x.id

【讨论】:

  • 抱歉,我已将其添加到我的问题中。
猜你喜欢
  • 2014-08-26
  • 2012-02-19
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2019-02-05
  • 2016-04-07
相关资源
最近更新 更多