Knex.js:加入 'select' 和 'where' 子句
Posted
技术标签:
【中文标题】Knex.js:加入 \'select\' 和 \'where\' 子句【英文标题】:Knex.js: join 'select' with 'where' clauseKnex.js:加入 'select' 和 'where' 子句 【发布时间】:2020-08-24 10:15:56 【问题描述】:我尝试为此 SQL 查询创建 knex
查询:
SELECT
*
FROM
ad AS a
LEFT JOIN ad_file AS af ON
af.ad_id = a.id
AND af.file_id = (
SELECT
MIN(file_id)
FROM
ad_file AS afmin
WHERE
afmin .ad_id = a.id )
这是我的 JS 代码:
const trx = await knex.transaction();
const query = trx(a: "ad");
const fileMin = trx(afm: "ad_file");
fileMin.min("file_id");
fileMin.where("afm.ad_id", knex.raw("`a`.`id`"));
query.leftOuterJoin(af: "ad_file", function ()
this.on("a.id", "af.ad_id");
this.on("af.file_id", fileMin);
);
但我最后有错误的 SQL 查询:
select
*
from
`ad` as `a`
left outer join `ad_file` as `af` on
`a`.`id` = `af`.`ad_id`
and `af`.`file_id` =
select
min(`file_id`)
from
`ad_file` as `afm`
where
`afm`.`ad_id` = `a`.`id`
如何在SELECT MIN(file_id) FROM ... WHERE
中添加括号?
【问题讨论】:
【参考方案1】:这是我自己的解决方案:
query.leftOuterJoin(af: "ad_file", function ()
this.on("a.id", "af.ad_id");
this.on("af.file_id", trx.raw("?", [fileMin]));
);
【讨论】:
我对语法添加了小修复。在某些情况下,用查询简单地连接字符串可能会打开 SQL 注入漏洞。以上是关于Knex.js:加入 'select' 和 'where' 子句的主要内容,如果未能解决你的问题,请参考以下文章
如何在Knex中扩展QueryBuilder类时访问当前上下文的事务