假设有以下情况:
create schema bv;
create table bv.user(id bigint primary key);
create table bv.user_photo (
id bigint primary key,
url varchar(255) not null,
user_id bigint references bv.user(id)
);
insert into bv.user values (100), (101);
insert into bv.user_photo values
(1, 'https://1.com', 100),
(3, 'https://3.com', 100),
(4, 'https://4.com', 101),
(2, 'https://2.com', 100);
我想 for each 用户查询并构建一个对象,并在结果中只包含最新的图像.
这就是我所拥有的:
select
json_build_object(
'id', u.id,
'latest_image', up.url
) user
from bv.user u
left join bv.user_photo up
on u.id = up.user_id
然而,这将返回:
[
{"id" : 100, "url" : "https://2.com"},
{"id" : 100, "url" : "https://3.com"},
{"id" : 100, "url" : "https://1.com"},
{"id" : 101, "url" : "https://4.com"}
]
然而,预期的结果是:
[
{"id" : 100, "url" : "https://3.com"},
{"id" : 101, "url" : "https://4.com"}
]
我试过用distinct
:
select distinct on(u.id)
json_build_object(
'id', u.id,
'url', up.url
) user
from bv.user u
left join bv.user_photo up
on u.id = up.user_id
order by u.id, up.id DESC
但我的问题是,这是不是正确的方法?我觉得在这种情况下我不应该用distinct
.