【问题标题】:node-sql-query build complex querynode-sql-query 构建复杂查询
【发布时间】:2016-02-04 06:54:52
【问题描述】:

我将 Node.js 与sails.js 一起使用

我正在尝试构建一个查询,其中包含这样的子查询:

SELECT 
    `id`, `col1`, `col2`, `col3`,
    (SELECT COUNT(*) FROM `tablename` 
        WHERE (`col1` = 'someValue') AND (`col2` = `t`.`col2`)) AS `total` 
FROM `tablename` `t` 
WHERE `col1` = 'value2' AND `col3` = 'value3' 
ORDER BY `total` ASC

我知道我可以在我的模型中写:

//./api/models/tablename.js
module.exports = {
    ...
    functionName() {
        this.query(aboveSQLQuery)
            .then(found => {
                doSomething();
            })
            .catch(err => {
                handleError(err);
            });
    }
}

但我不想使用它,所以我找到了node-sql-query 模块,所以我可以像这样构建查询:

let
    sql = require('sql-query'),
    sqlQuery = sql.Query(),
    sqlSelect = sqlQuery.select(),
    subQuery = sqlSelect
        .from('tablename')
        .where({col1: "someValue"}, {__sql: [['col2 = t.col2']]})
        .count()
        .build(),

    /* subQuery = "SELECT COUNT(*) FROM `tablename` 
                   WHERE (`col1` = 'someValue') AND (`col2` = `t`.`col2`)"
    */

    masterQuery = sqlSelect
        .from('tablename')
        .select(['id', 'col1', 'col2', 'col3', {a: "total", sql: subQuery}])
        .where({col1: "value2", col3: "value3"})
        .order('total', 'A')
        .build();

    /* masterQuery = "SELECT `id`, `col1`, `col2`, `col3`, 
                          (SELECT COUNT(*) FROM `tablename` 
                          WHERE (`col1` = 'someValue') AND (`col2` = `t`.`col2`)) 
                          AS `total` 
                      FROM `tablename` 
                      WHERE `col1` = 'value2' AND `col3` = 'value3' 
                      ORDER BY `total` ASC"
    */

masterQuery 没有按预期工作,但如果我将第二个 FROM

FROM `tablename`

FROM `tablename` `t`

它有效。

任何帮助将不胜感激

【问题讨论】:

    标签: mysql node.js subquery sails.js waterline


    【解决方案1】:

    我刚刚找到knex,并设法做到了这一点:

    let
        knex = require('knex')({
            client: "mysql"
        }),
        subQuery, masterQuery;
    
    subQuery = knex('tablename')
        .count()
        .where({col1: "someValue"})
        .andWhereRaw('`col2` = `t`.`col2`')
        .select()
        .from('tablename')
        .as('total');
    
    masterQuery = knex('tablename')
        .select(['id', 'col1', 'col2', 'col3', subQuery])
        .from(knex.raw('`tablename` `t`'))
        .where({col1: "value2", location: "value3"})
        .orderBy('total', 'asc')
        .limit(1)
        .toString();
    

    然后使用水线评估查询:

    this.query(masterQuery, (err, found) => {
        doSomething();
    });
    

    【讨论】:

      【解决方案2】:

      Waterline 使用 node-mysql package,因此您可以对模型执行任何纯 sql 查询,例如:

      Model.query(query, params, callback);
      

      【讨论】:

        猜你喜欢
        • 2019-08-05
        • 1970-01-01
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        相关资源
        最近更新 更多