如何使用动态数组使用where子句查询mysql数据库

Posted

技术标签:

【中文标题】如何使用动态数组使用where子句查询mysql数据库【英文标题】:how to query mysql database with where clause using dynamic array 【发布时间】:2014-06-01 11:43:47 【问题描述】:

我正在尝试使用下面的 where 子句查询 mysql 数据库。

这里的popularTopicsNames是一个动态数组,它的长度和元素是变化的。

var scoreQuery=connection.query('SELECT * FROM LEADERBOARD WHERE SUBTOPIC IN ('+popularTopicsNames+')', function(err,result,fields)
if(err) throw err;
else
    console.log(result);
    

【问题讨论】:

【参考方案1】:

这将以更易读的方式解决问题。

var scoreQuery = connection.query(`SELECT * FROM LEADERBOARD WHERE SUBTOPIC IN (?)`, [popularTopicsNames],
(err, result, _fields) => 
    if (err) 
        throw err;
     else 
        console.log(result);
    
);

【讨论】:

【参考方案2】:

如果它只是一个数组,那么你试图将它作为一个字符串传递,这是行不通的。

试试

var scoreQuery = connection.query("SELECT * FROM LEADERBOARD WHERE SUBTOPIC IN ('" + popularTopicsNames.map(mysql.escape).join("','") + "')",
    function(err, result, fields) 
        if (err) 
            throw err;
         else 
            console.log(result);
        
    );

【讨论】:

括号内缺少开头和结尾的单引号。如果没有它们,您最终会得到数组中超过 1 个项目的无效 SQL。示例:SELECT * FROM LEADERBOARD WHERE SUBTOPIC IN (foo','bar) 另外,如果主题名称是用户提交的,那么应该先对其进行适当的转义,以防止SQL注入攻击。 我认为你需要类似popularTopicsNames.map(mysql.escape).join("','") 的东西。 @mscdex 你是对的,因为转义返回值用引号括起来。

以上是关于如何使用动态数组使用where子句查询mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章

从选项(来自 rds - mysql)创建动态框架,提供带有 where 子句的自定义查询

将数组转换为 WHERE IN mysql 子句的格式

Linq to Entities 中的动态 where 子句 (OR)

Mysql在where子句中优化子查询

如何使用 SQL 格式的动态 where 子句制作谓词

如何从 Joomla 的组件菜单项中获取 MySQL 查询结果并使用 foreach where 子句进行优化?