从内部联接允许数组中的重复键

时间:2014-07-24 23:22:37

标签: javascript arrays inner-join

我正在 node.js 制作网络应用程序,并且我已经进行了查询以从USERS表中获取用户数据,同时获得来自奖励表。我只需要USERS表中的一行,但是(可能)来自REWARDS表的多行。

SELECT * FROM users u INNER JOIN rewards r ON u.ID = r.uid WHERE u.id = '+uid;

输出:

{ ID: 2,
  username: 'hi',
  password: 'password',
  userlevel: 10,
  balance: 500,
  bonusbalance: 0,
  level: 3,
  lprogress: 2,
  RID: 4,
  uid: 2,
  reward: '25 FREE bonus balance!' }

这看起来正是我想要的,但是有多行符合REWARDS表的查询要求(REWARDS表输出从RID开始)。

问题是javascript会覆盖REWARDS表中最后一行的密钥(RID,uid,reward)。如何将所有奖励与单个用户ID相关联?我更喜欢使用SQL来获取正确的数据,但是javascript解决方案也可以。

我的解决方案

我刚在2个不同的函数中使用了2个查询,这是完整的代码,也许有人发现它很有用。

完整代码:

    getUser: function(uid, callback) {
  q = 'SELECT * FROM users WHERE ID = '+uid;
  doQuery(q, function(user) {
    getRewards(uid, function(rewards) {
      if (rewards === false) {
        callback(user[0]);
      } else {
        user[0]['rewards'] = new Array();
        rewards.forEach(function(reward) {
          user[0]['rewards'].push(reward);
        });
        console.log(user[0]);
        callback(user[0]);
      }
    });
  });
}

<snip>


function getRewards(uid, callback) {
  q = 'SELECT * FROM rewards WHERE uid = '+uid;
  doQuery(q, function(rewards) {
    callback(rewards);
  });
}

function doQuery(query, callback) {
  sql.getConnection(function(err, connection) {
    connection.query('use casino');
    connection.query(query, function(err, rows, fields) {
            connection.release();
            if (err) {
              callback(err);
            } else {
              if (rows.length == 0) {
                callback(false);
              } else {
                callback(rows);
              }
            }
        });
   });
}

输出:

{ ID: 2,
  username: 'hi',
  password: 'password',
  userlevel: 10,
  balance: 5000,
  bonusbalance: 0,
  level: 3,
  lprogress: 36,
  rewards:
   [ { RID: 1, uid: 2, reward: 'One FREE scratch card!', level: 2 },
     { RID: 2, uid: 2, reward: '25 FREE bonus balance', level: 3 } ] }

0 个答案:

没有答案