如何在Supabase中通过用户ID获取各用户的最新记录?
实现Supabase按用户ID获取最新date记录(Node.js+Express环境)
你已经通过DISTINCT ON写出了正确的SQL查询,下面分别介绍用视图和RPC存储过程实现需求的具体操作,以及对应的Node.js调用代码:
方法一:创建视图
视图相当于把你的查询逻辑预存在数据库里,之后可以像查询普通表一样调用它。
- 在Supabase控制台打开「SQL编辑器」,执行以下SQL创建视图:
CREATE VIEW user_latest_activity AS SELECT DISTINCT ON (user_id) user_id, date FROM "activity-historic-tracked" ORDER BY user_id, date DESC;
- 在Node.js+Express代码中,直接查询这个视图并过滤指定用户ID:
const { data, error } = await supabase .from('user_latest_activity') .select('user_id, date') .in('user_id', user_ids);
如果后续表结构或查询逻辑需要调整,只需重新执行CREATE OR REPLACE VIEW语句更新视图即可。
方法二:创建RPC存储过程
RPC(远程过程调用)适合封装带参数的复杂查询,能直接在代码中调用数据库函数。
- 在Supabase控制台的「SQL编辑器」中,创建接收用户ID数组参数的函数:
CREATE OR REPLACE FUNCTION get_user_latest_activity(user_ids_arg INT[]) RETURNS TABLE(user_id INT, date TIMESTAMP) AS $$ BEGIN RETURN QUERY SELECT DISTINCT ON (user_id) user_id, date FROM "activity-historic-tracked" WHERE user_id = ANY(user_ids_arg) ORDER BY user_id, date DESC; END; $$ LANGUAGE plpgsql SECURITY DEFINER;
注意:如果你的
user_id是UUID类型,需要把函数中的INT替换成UUID;date字段类型如果不是TIMESTAMP,也要对应修改。
- 在Node.js代码中,通过
supabase.rpc调用这个函数:
const { data, error } = await supabase .rpc('get_user_latest_activity', { user_ids_arg: user_ids });
权限说明
- 视图默认继承原表的访问权限,确保你的Supabase角色有
activity-historic-tracked表的SELECT权限即可。 - RPC函数如果用了
SECURITY DEFINER,会以函数创建者的权限执行,适合处理需要更高权限的场景;如果不需要,可改为SECURITY INVOKER,使用当前调用用户的权限。
内容的提问来源于stack exchange,提问作者Florentino Moore
相关产品推荐
相关产品推荐

