首先,我必须告诉你,我在这个“宇宙”中是个傻瓜。我正在使用:ExpressJs,MySql,Body-Parser,Express-session,Ejs模板在Node中创建基本联系人应用程序。
我的数据库由3个表组成:
我想在/ myProfile页面上列出有关用户及其联系人的所有详细信息。 我不知道如何处理选择查询。
因此,在编写了一些文档之后,我这样做了:
conn.query('SELECT * FROM user_contacts WHERE user_id= ?', req.session.user_id, function (err, result) {
if(err) throw err;
console.log(result);
var queryArray = "";
for(var i = 0; i < result.length; i++){
queryArray += `SELECT * FROM contacts WHERE ct_id= ${result[i].ct_id}; `;
}
console.log(queryArray);
conn.query(queryArray, function (err, result) {
if(err) throw err;
console.log(result);
res.render('myProfile/contacts', {
title: `${req.session.user_nickname}'s Contacts`,
data: result
});
});
});
但是我有一个错误
ER_PARSE_ERROR:您的SQL语法有误;
..当queryArray.length> 1
我进行了搜索,这与多语句查询有关,但是我不知道如何解决。
我修改了代码。
conn.query('SELECT * FROM user_contacts WHERE user_id= ?', req.session.user_id, function (err, result) {
if(err) throw err;
var datas = [];
for(var i = 0; i < result.length; i++){
getContacts = function(query){
conn.query(query, function (err, result) {
console.log('Creating data');
data = {
user: req.session.user_nickname,
contact:{
ct_firstName: result[0].ct_firstName,
ct_SecondName: result[0].ct_SecondName,
ct_PhoneNumber: result[0].ct_PhoneNumber
}
}
return data;
});
}
console.log('Send data to array');
datas.push(getContacts(`SELECT * FROM contacts WHERE ct_id = ${result[i].ct_id}`));
}
console.log(datas); // [ undefined, undefined ]
res.render('myProfile/contacts',{
title: `${req.session.user_nickname}'s profile`,
data: datas
})
});
但是现在我的数组包含未定义的对象?有什么办法吗? 也许是关于范围的事?
我的结果:
我在创建对象之前将其推入数组。怎么可能?
答案 0 :(得分:0)
1797,
我注意到您有几个小查询正在获取给定用户的联系信息。您可以通过将查询合并为一个查询来简化代码。通常,一个大查询效率更高(而且更易于维护)。我正在使用联接。 More info here。
const contacts = [];
const query = "
SELECT c.*
FROM user_contact uc
JOIN contact c ON uc.contact_id = c.contact_id
WHERE uc.user_id = ?
GROUP BY c.contact_id
";
conn.query(query, req.session.user_id, (err, results) => {
if (err) throw new Error(err);
// it seems that this could just be 'contacts = results' since they
// have the same structure
contacts = results.map(result => {
return {
ct_firstName: result[0].ct_firstName,
ct_SecondName: result[0].ct_SecondName,
ct_PhoneNumber: result[0].ct_PhoneNumber
};
});
res.render('myProfile/contacts',{
title: `${req.session.user_nickname}'s profile`,
data: contacts
});
});