内连接分页和排序

问题描述 投票:0回答:1

我有2张桌子:

CREATE TABLE account (
  id INT
);

CREATE TABLE device (
  id INT,
  account_id INT,
  token text
);

我想在我的网页表格上显示用户及其所有设备令牌。表应支持过滤、分页和排序。如果我想按设备令牌进行过滤:

'%BIZ%'
,我想显示联系人及其所有设备(如果其中至少一个包含
'%BIZ%'
关键字)。

这是第一页 5 个联系人的工作示例,带有

'%BIZ%'
设备令牌过滤器关键字,按设备令牌排序
desc
:

with cte as
(
  select
    a.id
    from account a
  inner join device d on d.account_id = a.id
  where d.token like 'BIZ%'
  group by a.id
  order by max(d.token) desc
  offset 0 rows
  fetch first 5 rows only
)

select
  cte.id,
  d.token
from cte
inner join device d on d.account_id = cte.id
order by d.token desc

我想知道是否有更简单的方法可以做到这一点,例如没有双

order by
。你有什么建议吗?

示例代码:https://www.db-fiddle.com/f/vZCNfgvppXhmnz8sHbaWda/8

postgresql
1个回答
0
投票

我在您的测试数据中添加了一些数据,用于当帐户的一行满足令牌过滤器的条件时的情况,但您需要显示该帐户的所有行。

参见示例

没有分页

select * 
from device d
where d.account_id in( select distinct account_id
                       from device d2
                       where d2.token like 'BIZ%')
order by d.account_id,d.token
id 账户 ID 代币
1 1 BIZ-111
2 1 BIZ-333
3 1 BIZ-555
5 2 BIZ-666
4 2 BIZ-777
6 3 BIZ-999
7 4 BIZ-222
10 7 BIZ-888
11 8 BIZ-444
12 8 在Z-444上
select * 
from device d
where d.account_id in( select distinct account_id
                       from device d2
                       where d2.token like 'BIZ%')
order by d.account_id,d.token
offset 0 rows
fetch first 5 rows only
id 账户 ID 代币
1 1 BIZ-111
2 1 BIZ-333
3 1 BIZ-555
5 2 BIZ-666
4 2 BIZ-777

下一页

...
offset 5 rows
fetch first 5 rows only
id 账户 ID 代币
6 3 BIZ-999
7 4 BIZ-222
10 7 BIZ-888
11 8 BIZ-444
12 8 在Z-444上

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.