2016-03-26 20 views
0

Bir SQL sorgusundan döndürülen verileri ilgili tablolara ayırmak için aşağıdaki kodda 'nestTables' seçeneğini kullanıyorum. Ayrıca, birincil tabloya dahil etmek istediğim, sorgumda hesaplanmış bir alan da dahil ediyorum. Bir örnek olarak NodeJS'de MySQL Sorgusu için nestTable Seçeneği ile Hesaplanmış Alanlar

, aşağıdaki yol yürütme am:

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

ve aşağıdaki JSON cevap alma am: İdeal olarak

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

, I halinde hesaplanmış alan dahil etmek istiyorum aşağıda gösterildiği gibi kişi alt grubu: hesaplanan alanı kişi tablosuna mı yoksa bu soruna uygun daha iyi bir çözüm var mı?

Şimdiden teşekkürler!

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) { 

ve bariz çözüm kullanarak js: Ben daha hoş bir çözüm yoktur sanmıyorum

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

cevap

1

Bunu çözmek için iki seçenek göreceksiniz, tek kirli yolu SQL kullanarak bunun için. FieldPacket veya RowDataPacket ayrıştırıcıyı kandırmak için bir olasılık olup olmadığını kontrol ettim, ancak bir tablo adını taklit etmenin bir yolunu görmedim (mysql sürücüsünü yamalamadan).

+0

Teşekkürler user3173842, Her iki durumu da test ettim ve eşit olarak çalışıyorlar. Faiz dışı, hangi yöntemlerden hangisinin en verimli olduğu düşünülebilir? İkinci çözüm ile gitmek için cazip değilim, ama forEach döngü ile büyük bir maliyet olup olmadığından emin değilim. –

+0

Maliyet oldukça düşüktür, bu yüzden sadece birkaç yüz veya daha az satır seçerseniz ölçülebilir bir fark olmamalıdır. MySQL muhtemelen biraz daha verimli olacaktır. İlk seçenek veritabanı tarafında bir miktar RAM gerektirir, ikincisi node.js tarafında CPU yükü üretir, bu yüzden ayrı sunucular varsa, daha fazla kaynağa sahip olduğum sistemi kullanan yolu seçerim - çünkü çıktı Aynı zamanda herhangi bir zamanda geçiş yapmak bile kolaydır. – user3173842

İlgili konular