javascript - 如何在 Knex 上使用 EXISTS 进行子查询?
问题描述
我正在尝试使用 knex 构建查询,但是在如何使用 condition 实现 'WHERE' 部分时遇到了很多麻烦EXISTS (SELECT * FROM caregiver_patient WHERE patient_id IN (0,1))
。
这是关于 SQL 的原始查询:
SELECT * FROM users
JOIN caregivers ON users.id = caregivers.user_id
JOIN caregiver_schedule ON caregivers.id = caregiver_schedule.caregiver_id
JOIN caregiver_patient ON caregivers.id = caregiver_patient.caregiver_id
JOIN patients ON caregiver_patient.patient_id = patients.id
WHERE caregiver_schedule.week_day = 2
AND caregiver_schedule.from_time <= 1320
AND caregiver_schedule.to_time > 1320
AND EXISTS (SELECT * FROM caregiver_patient WHERE patient_id IN (0,1));
这是迄今为止我使用 Knex 的代码:
const caregivers = await db("caregivers")
.whereExists(function () {
this.select("caregiver_schedule.*")
.from("caregiver_schedule")
.whereRaw("`caregiver_schedule`.`caregiver_id` = `caregivers`.`id`")
.whereRaw("`caregiver_schedule`.`week_day` = ??", [Number(week_day)])
.whereRaw("`caregiver_schedule`.`from_time` <= ??", [timeInMinutes])
.whereRaw("`caregiver_schedule`.`to_time` > ??", [timeInMinutes]);
})
.join("users", "caregivers.user_id", "=", "users.id")
.join("patients", "caregiver_patient.patient_id", "=", "patients.id")
.select([
"caregivers.*",
"users.*",
"caregiver_schedule.*",
"patients.*",
]);
原始查询中的所有数字都应该是变量。里面的数字IN
应该是一个数组。
谁能帮我在 Knex 上完成这个查询?
解决方案
您提供的示例 knex 查询与原始 SQL 查询完全不相似,如果您想将原始 SQL 查询转换为 knex 查询,这就是它的样子:
const result = await db('users')
.innerJoin('caregivers', 'users.id', 'caregivers.user_id')
.innerJoin('caregiver_schedule', 'caregivers.id' 'caregiver_schedule.caregiver_id')
.innerJoin('caregiver_patient', 'caregivers.id', 'caregiver_patient.caregiver_id')
.innerJoin('patients', 'caregiver_patient.patient_id', 'patients.id')
.where('caregiver_schedule.week_day', Number(week_day))
.where('caregiver_schedule.from_time', '<=', timeInMinutes)
.where('caregiver_schedule.to_time', '>', timeInMinutes)
.whereExists(function() {
this.select('*')
.from('caregiver_patient')
.whereIn('patient_id', [0,1]);
})
.select('*');
这假定db
变量是您的 knex 连接。我还不得不猜测你想用来替换原始 SQL 中硬编码值的变量,随意用你喜欢的任何变量替换这些变量。
推荐阅读
- amazon-cognito - AWS Cognito 如何在多个 UserPools 中对用户进行身份验证
- php - php文件在服务器上有效,但在部署时无效
- wordpress - 为什么主题我不想翻译这个词
- jquery - 如何使用 V8ScriptEngine (Clearscript) 在 c# 代码中加载 jquery 文件?
- node.js - 如何处理 HTTP 请求对 Node.js 性能的影响
- stored-procedures - 如何在 where 子句中使用存储函数(过程)?(Entity Framework Core 2.0)
- python - 如何将多个熊猫系列串联成一行?
- rest - 尽管传递了参数,但 REST Api 调用失败,因为缺少参数
- django - 返回 JSON 响应以及可下载的文件
- reactjs - 是否会影响 react-native 应用程序性能的黄色警告?