You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Supabase中通过用户ID获取各用户的最新记录?

实现Supabase按用户ID获取最新date记录(Node.js+Express环境)

你已经通过DISTINCT ON写出了正确的SQL查询,下面分别介绍用视图和RPC存储过程实现需求的具体操作,以及对应的Node.js调用代码:

方法一:创建视图

视图相当于把你的查询逻辑预存在数据库里,之后可以像查询普通表一样调用它。

  1. 在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;
  1. 在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(远程过程调用)适合封装带参数的复杂查询,能直接在代码中调用数据库函数。

  1. 在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,也要对应修改。

  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:31:00