NodeJS 中 MySQL 查询的带有 nestTables 选项的计算字段

Calculated Fields with nestTables Option for MySQL Query in NodeJS

我在下面的代码中使用 'nestTables' 选项将从 SQL 查询返回的数据分离到它们各自的 table 中。我还在我的查询中包含一个计算字段,我想将其包含在主要 table 中。

例如,我正在执行以下路线:

router.route('/person/:personId').get(function(req,res){
    var person_id = req.params.personId;
    db.getConnection(function(err, connection) {
        if (err) {
            return res.status(503).send({ result: false, error: 'CONNECTION error: ' + err.code});
        } else {
            var sqlString='SELECT *, someField - 1 as calculated FROM person LEFT JOIN person_status ON person.id = person_status.person_id WHERE person.id = ' + person_id;
            var options={sql:sqlString,nestTables:true};
            connection.query(options, function(error, rows, fields) {
                connection.release();

                var nestingOptions = [
                    {tableName: 'person', pkey:'id'},
                    {tableName: 'person_status', pkey:'id', fkeys:[{table:'person',col:'person_id'}]}
                ];

                if (error) {
                    return res.status(500).send({ result: false, error: 'QUERY ERROR: ' + error.code});
                } else {
                    return res.status(200).send(rows);                 
                }
            });
        }
    });
});

我收到以下 JSON 响应:

[
  {
    "person": {
      "id": 1,
      other person data . . . 
      "person_status": [
        {
          "id": 3,
          other data . . . 
        }
      ]
    },
    "person_status": {
      "id": 3,
      other data . . . 
    },
    "": {
      "calculated": 0
    }
  }
]

理想情况下,我想将计算字段包含到人员子组中,如下所示:

[
  {
    "person": {
      "id": 1,
      "calculated": 0
      other person data . . . 
      "person_status": [
        {
          "id": 3,
          other data . . . 
        }
      ]
    },
    "person_status": {
      "id": 3,
      other data . . . 
    }
  }
]

有什么方法可以将计算字段包含到人中 table,或者有更好的解决方案来解决这个问题吗?

提前致谢!

我看到有两种解决方法,一种是使用 SQL:

的肮脏方法
var sqlString = 'SELECT *, someField - 1 as calculated FROM person WHERE person.id=?';
sqlString = 'SELECT * FROM (' + sqlString + ') as person';
sqlString += ' LEFT JOIN person_status ON person.id = person_status.person_id';
var options={sql:sqlString, nestTables:true};
connection.query(options, [person_id], function(error, rows, fields) {

以及使用 js 的明显解决方案:

var sqlString = 'SELECT *, someField - 1 as calculated FROM person LEFT JOIN person_status ON person.id = person_status.person_id WHERE person.id=?';
var options = {sql:sqlString, nestTables:true};
connection.query(options, [person_id], function(error, rows, fields) {
  rows.forEach(function(row) {
    row.person.calculated = row[''].calculated;
    delete row[''];
  });

我认为没有比这更令人愉快的解决方案了。我什至检查了是否有可能欺骗 FieldPacket 或 RowDataPacket 解析器,但没有看到伪造 table 名称的方法(没有猴子修补 mysql 驱动程序)。