选择1对多的更好方法?

时间:2014-06-14 13:19:36

标签: mysql node.js

我有一个基于express.js的休息应用程序。请看下面的代码并建议我更好的方法。

我想选择用户及其相关图像(1个用户有很多图像)。

function getUser (connection, req, res) {
   var userId = req.params.id;
   connection.query('SELECT * FROM user p'
                    + ' WHERE p.id = ' + connection.escape(userId), function handleSql(err, rows) {
    if (err){ logAndRespond(err,res); return; }
    if (rows.length === 0){ res.send(204); return; }

    var adId = rows[0].adId;
    // load images
    connection.query('SELECT id, url FROM image WHERE ad_id = ' + connection.escape(adId), function (err, imgRows) {
        if (err){ logAndRespond(err,res); return; }
        if (rows.length != 0){ 
            rows[0].images = imgRows;
        }

        res.json({'user': rows});
        connection.release();
    });

});
}

1 个答案:

答案 0 :(得分:0)

  • 您不必自行转义参数
  • 如果发生错误,则不释放连接

现在的问题是我不知道你想对选定的行做什么。您还要检查rows.length两次,但如果第一个查询中没有任何记录,则第二个查询将不会被执行。

    function getUser(conn, req, res) {
        conn.query("SELECT * FROM user p WHERE p.id = ?;", [req.params.id], function(err, rows) {
            if (err) {
                return logAndRespond(err, res);
            }

            if (!rows.length) {
                return res.send(204);
            }

            conn.query("SELECT id, url FROM image WHERE ad_id = ?;", [rows[0].adId], function(err, imgRows) {
                if (err) {
                    return logAndRespond(err, res);
               }

               if (rows.length) {  // ???
                   rows[0].images = imgRows;
               }

               res.json({"user": rows});
               conn.release();
            });
        });
    }