我有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
。你有什么建议吗?
我在您的测试数据中添加了一些数据,用于当帐户的一行满足令牌过滤器的条件时的情况,但您需要显示该帐户的所有行。
参见示例
没有分页
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上 |