如何在Prisma中查询1-N关联最新记录满足指定条件的用户?
解决方案
方式1:Prisma常规查询+应用层过滤(易维护,适合中小数据量)
直接通过Prisma标准语法查询,在应用层做最终过滤,写法简单易维护:
// 查询所有有投诉的用户,同时关联获取每个用户最新的1条投诉 const usersWithLatestComplaint = await prisma.user.findMany({ where: { complaints: { some: {} // 过滤无投诉的用户,匹配规则3 } }, include: { complaints: { orderBy: { creationTime: 'desc' }, take: 1 // 仅取最新1条投诉 } } }) // 过滤出最新投诉优先级为HIGH的用户,匹配规则1、2 const targetUsers = usersWithLatestComplaint.filter(user => { return user.complaints[0].priority === 'HIGH' })
方式2:原生SQL查询(性能更高,适合大数据量)
直接通过数据库窗口函数在查询层完成所有过滤,不需要应用层二次处理,性能更优:
const targetUsers = await prisma.$queryRaw` SELECT u.* FROM users u INNER JOIN ( SELECT user_id, priority, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY creation_time DESC) AS rn FROM complaints ) c ON u.id = c.user_id WHERE c.rn = 1 AND c.priority = 'HIGH' `
备注:如果你的Prisma Schema自定义了数据库表名、字段名映射,需要对应调整SQL语句中的表名和字段名。
补充说明
目前Prisma官方暂未支持直接在关联查询的where条件中筛选「最新关联记录满足指定条件」的语法,上述两种是当前最通用的实现方案,可以根据业务数据规模选择。
内容的提问来源于stack exchange,提问作者Raffaele
相关产品推荐
相关产品推荐

