【问题标题】:Proper pagination in a JOIN selectJOIN 选择中的正确分页
【发布时间】:2013-03-31 14:16:28
【问题描述】:

我有一条 SQL 语句

select * 
from users u left join files f
on u.id = f.user_id
where f.mime_type = 'jpg'
order by u.join_date desc
limit 10 offset 10

关系是 1-N:用户可能有很多文件。

这有效地选择了第二个 10 元素页面。

问题是此查询限制/偏移连接表,但我想限制/偏移第一个 (users) 表中的不同行。

如何做?我以 PostgreSQL 和 HSQLDB 为目标

【问题讨论】:

  • 我认为您要求的是拥有 JPG 类型文件的用户的第二页(页面大小 10)。在一个用户拥有 10 个 jpg 文件的数据集上进行测试。我想你会得到一个唯一的用户,10 行。

标签: sql postgresql join pagination hsqldb


【解决方案1】:

你需要先限制外表上的select,然后再将依赖表join到结果中。

select * from (select * from users where f.mime_type = 'jpg' limit 10 offset 10)  as u
left join files f
   on u.id = f.user_id

【讨论】:

  • 您可以在子选择中order by 并在files 表上添加where 子句吗?
  • 是的,但是子选择的排序具有不同的语义,具体取决于您的操作方式(在子选择内部或外部)。但你甚至可以同时做。
  • 我认为这只会为第十个用户选择具有 f.mime_type = 'jpg' 文件的用户。这意味着您不会有 10 个结果,而是 N 个结果,N
  • -1。很困惑@Queequeg 接受了这个答案,因为它放弃了 JPG 标准。如果您将内部查询中的用户数限制为 10,则外部可能会产生零个拥有 JPG 文件的用户。
  • 我已经编辑了答案以包含子查询中的条件
猜你喜欢
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
相关资源
最近更新 更多