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

Prisma中如何实现多列组合匹配的where in查询

Prisma多字段组合值匹配WHERE IN实现方案

Prisma支持多字段成对匹配的查询需求。你现有写法的逻辑是两个字段的in判定完全独立,只要单字段落在对应取值列表里就会命中,无法实现「字段值必须成对匹配目标组合」的效果:比如目标组合是(user_id:1, school_id:11)、(user_id:2, school_id:22)时,现有写法会错误命中user_id=1、school_id=22的记录。

实现方案

  • 通用OR拼接写法(全版本兼容)
    直接将每一组目标值组合转为等值匹配条件,再用OR包裹所有条件,即可实现成对匹配效果:
const targetUserPairs = [
  { user_id: 1, school_id: 11 },
  { user_id: 2, school_id: 22 }
]

await prisma.user.findMany({
  where: {
    OR: targetUserPairs.map(pair => ({
      user_id: pair.user_id,
      school_id: pair.school_id
    }))
  }
})

生成的SQL会按(user_id=1 AND school_id=11) OR (user_id=2 AND school_id=22)的逻辑判定,完全符合成对值匹配要求。

  • 复合键原生in写法(需定义复合约束)
    如果你的User模型在Prisma Schema中为user_id和school_id定义了复合主键或复合唯一约束,例如:
model User {
  user_id   Int
  school_id Int
  // 其余业务字段
  @@unique([user_id, school_id]) // 定义复合唯一约束
}

Prisma会自动生成对应复合键字段,可以直接使用更简洁的in语法:

await prisma.user.findMany({
  where: {
    user_id_school_id: {
      in: targetUserPairs.map(pair => [pair.user_id, pair.school_id])
    }
  }
})
  • 大数据量场景原生SQL写法
    如果需要匹配的组合数量超过1000组,拼接OR条件可能导致生成的SQL语句过长,此时可以使用原生SQL的多列IN语法实现:
// 以下为PostgreSQL语法示例,MySQL等其他数据库可对应调整占位符规则
const placeholders = targetUserPairs.map((_, idx) => `($${idx*2 + 1}, $${idx*2 + 2})`).join(',')
const params = targetUserPairs.flatMap(pair => [pair.user_id, pair.school_id])

const users = await prisma.$queryRawUnsafe(
  `SELECT * FROM "user" WHERE (user_id, school_id) IN (${placeholders})`,
  ...params
)

注意:使用原生SQL时必须通过参数绑定传递取值,禁止直接拼接未转义的用户输入内容,避免SQL注入风险。

内容的提问来源于stack exchange,提问作者tempra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:48:19