MySQL Node.js问题 -- SELECT EXISTS查询

3
这个逻辑有什么问题?
var selectString = 'SELECT EXISTS(SELECT 1 FROM users WHERE user="'+username+'")';

var queryUserExists = connection.query(selectString);
var resultsLength = queryUserExists._results.length;

console.log(queryUserExists);

if(resultsLength > 0){
   socket.write("fail user already exists"+"\r\n");

} else {
    console.log('insert=');
    var query = connection.query (
        'INSERT INTO users '+
        'SET user = ?, password = ?, token = ?',
        [username, password, token]
    );

    socket.write("success"+"\r\n");
}

resultsLength始终返回零。应该如何正确使用此查询?

返回的对象:

sql: 'SELECT 1 FROM users WHERE user = \'a new user is my name\' ORDER BY user LIMIT 1',
typeCast: true,
nestTables: false,
_resultSet: null,
_results: [],
_fields: [],
_index: 0,
_loadError: null }
2个回答

4
适当的代码:感谢https://stackoverflow.com/users/722783/mahmoud-gamal为优化的数据库查询提供了帮助!
connection.query("SELECT 1 FROM users WHERE user = '"+username+"' ORDER BY user LIMIT 1", function (error, results, fields) {
if (error) {
    console.log(error);
    socket.write("fail internal error"+"\r\n");
}
if (results.length  > 0) {
    console.log('fail');
    socket.write("fail user already exists"+"\r\n");

} else {


        console.log('insert');
        var query = connection.query (
            'INSERT INTO users '+
            'SET user = ?, password = ?, token = ?',
            [username, password, token]
        );

        socket.write("success"+"\r\n");


}

console.log(results);
});

2

试试这个:

SELECT 1
FROM users
WHERE EXISTS (SELECT 1 
              FROM users 
              WHERE user = 'username')
ORDER BY user
LIMIT 1;

或者:为什么不:

SELECT 1
FROM users
WHERE user = 'username'
ORDER BY user
LIMIT 1;

请注意:

ORDER BY user
LIMIT 1;

仅用于性能优化。


我该如何在Node中使用这个? - stackOverFlew
1
@user1392515 - 抱歉,请在 var selectString = '我发布的查询'; 中替换查询。 - Mahmoud Gamal
1
使用新的查询,您将期望只返回一个值 1,以表示找到了用户,或者返回 NULL 值,或者在未找到用户的情况下没有返回任何行。我不太清楚如何使用您拥有的 node.js 代码进行测试,但这是基本思路。 - Mahmoud Gamal
@user1392515 - 我注意到你之前指出的链接中,user变量被像这样使用\括起来\'a new user is my name\'。这可能是问题所在。在执行查询之前尝试打印查询,用户参数的值不应该被这些\所包围。 - Mahmoud Gamal
我认为由于某种原因,它在日志输出时会跳过引号。无论如何,我通过遵循一些示例获得了可工作的代码。非常感谢已经优化的查询! - stackOverFlew
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接