【问题标题】: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 中添加括号?

【问题讨论】:

    标签: javascript sql knex.js


    【解决方案1】:

    这是我自己的解决方案:

    query.leftOuterJoin({af: "ad_file"}, function () {
        this.on("a.id", "af.ad_id");
        this.on("af.file_id", trx.raw("?", [fileMin]));
    });
    

    【讨论】:

    • 我对语法添加了小修复。在某些情况下,用查询简单地连接字符串可能会打开 SQL 注入漏洞。
    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 2019-05-13
    • 2017-07-11
    • 2016-03-18
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多