我正在 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 } ] }