2016-03-26 11 views
0

SQLクエリから返されたデータをそれぞれのテーブルに分割するために、以下のコードで 'nestTables'オプションを使用しています。私はまた、プライマリテーブルに含める計算されたフィールドをクエリに含めます。例としてMySQL用のnestTablesオプション付き計算フィールドNodeJSでのクエリ

は、私は次のルート実行午前:

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);     
       } 
      }); 
     } 
    }); 
}); 

及びIは、以下の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 . . . 
    } 
    } 
] 

私が含めることができる方法はありますか計算されたフィールドをpersonテーブルに追加するか、この問題に適したより良いソリューションがありますか?

ありがとうございます!

答えて

1

私はこの問題を解決するには、2つのオプション、1つの汚いやり方SQLを使用して参照してください。私はより快適な解決策があるとは思わない

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['']; 
    }); 

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を使用して明白な解決策をこのため。私はFieldPacketやRowDataPacketパーサーを欺く可能性があるのか​​どうかをチェックしましたが、テーブル名を偽る方法は見当たりませんでした。

+0

ありがとうございますuser3173842、私は両方のケースをテストして、それらは同等に機能します。興味のないところでは、これらの方法のどれが最も効率的であると考えられるでしょうか?私は2番目の解決方法を試してみたいと思いますが、ForEachループで大きなコストがかかるかどうかはわかりません。 –

+0

コストが比較的低いので、数百行以下を選択している場合は、測定可能な差はありません。 MySQLはおそらくもう少し効率的です。最初のオプションはデータベース側にいくつかのRAMを必要とし、2つ目はnode.js側にCPU負荷を生成するため、別個のサーバがある場合は、出力を利用できるシステムを使用する方法を選択します。同じことがいつでも簡単に切り替えることができます。 – user3173842

関連する問題