【发布时间】:2021-02-24 16:06:24
【问题描述】:
我想创建一个模式匹配的搜索查询,在给定关键字的情况下最多返回 10 个用户。它从两个表中获取数据:“用户”和“上传”。
'uploads' 包含所有用户上传或没有条目。对于每个找到的与关键字匹配的用户,我需要每个时间戳的最新条目,如果不存在,我需要该列的 null。
我的问题是我想不出一种方法来仅为用户选择最新的上传条目 (如果不存在条目,则将 null 作为列值)。
http://sqlfiddle.com/#!17/767bb/3
CREATE TABLE users (
"user_uuid" uuid NOT NULL,
"username" varchar(25)
);
CREATE TABLE uploads (
"file_uuid" uuid NOT NULL,
"user_uuid" uuid NOT NULL,
"timestamp" timestamptz(6) DEFAULT now()
);
insert into uploads(file_uuid, user_uuid) values
-- user1
('aaa3d0d1-a403-4af9-ba9e-c1df8fcb6952', '0123d0d1-a403-4af9-ba9e-c1df8fcb6952'),
('bbb3d0d1-a403-4af9-ba9e-c1df8fcb6952', '0123d0d1-a403-4af9-ba9e-c1df8fcb6952'),
-- user2
('ccc3d0d1-a403-4af9-ba9e-c1df8fcb6952', '1123d0d1-a403-4af9-ba9e-c1df8fcb6952'),
('ddd3d0d1-a403-4af9-ba9e-c1df8fcb6952', '1123d0d1-a403-4af9-ba9e-c1df8fcb6952')
-- user 3 has no uploads
;
insert into users
(user_uuid, username)
VALUES
('0123d0d1-a403-4af9-ba9e-c1df8fcb6952', 'user1'),
('1123d0d1-a403-4af9-ba9e-c1df8fcb6952', 'user2'),
('2123d0d1-a403-4af9-ba9e-c1df8fcb6952', 'user3');
我尝试了什么:
-- this query returns only one row
select
us.username,
us.user_uuid,
up.file_uuid as cover,
up.timestamp
from users us
right join (
select file_uuid, user_uuid, timestamp
from uploads
order by timestamp
limit 1
) up on us.user_uuid = up.user_uuid
WHERE
us.username ILIKE '%user%'
LIMIT 10;
我的期望
username user_uuid cover timestamp
user1 0123d0d1-a403-4af9-ba9e-c1df8fcb6952 aaa3d0d1-a403-4af9-ba9e-c1df8fcb6952 2021-02-24T15:57:51.199186Z
user2 1123d0d1-a403-4af9-ba9e-c1df8fcb6952 ddd3d0d1-a403-4af9-ba9e-c1df8fcb6952 2021-02-24T15:57:51.199186Z
user3 2123d0d1-a403-4af9-ba9e-c1df8fcb6952 null 2021-02-24T15:57:51.199186Z
【问题讨论】:
-
样本数据和期望的结果在问题中将阐明您想要做什么。目前还不清楚小提琴中的查询与该问题有什么关系。
标签: sql postgresql