mysql - 如何使用字符串数组搜索 MySQL 数据库?
问题描述
这是针对带有 NodeJS 的 Discord Bot 的。所以我有一个名为 args 的数组,其中包含调用命令时用户传递的参数。我想要做的是在“症状”列下搜索数据库并将这些行返回。但我只想要包含数组中单词的那些。例如,我发送命令“疼痛,喉咙痛”,机器人会将其转换为数组。然后我希望它使用包含这些单词的任何内容搜索数据库,但它不必按那个顺序,所以就像该行可以说“喉咙痛,头痛,疼痛”,它仍然会选择它,因为它至少包含这两个论点。
我尝试了以下解决方案:
SELECT * FROM diagnose WHERE Symptoms IN (${args})
但是,如果它只有一个词,那只会返回一行(那个词是咳嗽,没有别的,如果有另一个词就不会显示)。
SELECT * FROM diagnose WHERE Symptoms LIKE '%${args}%'
结果与上述相同。
我的代码:
if (!message.content.startsWith(prefix) || message.author.bot) return;
const args = message.content.slice(prefix.length).split(' ');
const command = args.shift().toLowerCase();
if(command === `symptoms`){
if(!args.length){
return message.channel.send("You didn't provide me any symptoms.");
}
var query = connection.query(`SELECT * FROM diagnose WHERE Symptoms LIKE '${args}'`);
console.log(args1);
query.on('error', function(err) {
throw err;
});
query.on('fields', function(fields) {
//console.log(fields);
});
query.on('result', function(row) {
//console.log(row);
message.channel.send(row.Outcome);
});
}
解决方案
实现这一目标的最简单但不是最有效的方法是:
SELECT *
FROM diagnose
WHERE 'pain' IN Symptoms
AND 'sore' IN Symptoms
AND 'throath' IN Symptoms
一种有效的方法是创建另一个表,其中症状列中的单词指向诊断。假设我们已经创建并填充了另一个表,例如 diagnosticWords,那么您可以这样做:
SELECT DISTINCT *
FROM diagnose d
INNER JOIN diagnoseWords w1 ON d.id=w1.id AND w1.word='pain'
INNER JOIN diagnoseWords w2 ON d.id=w2.id AND w2.word='sore'
INNER JOIN diagnoseWords w3 ON d.id=w3.id AND w3.word='throat'
当然,这需要索引,而且是以空间换时间。实现 INTERSECT 运算符的其他数据库,如 postgres 和 oracle,将允许您执行以下操作:
SELECT * FROM diagnose d
INNER JOIN diagnoseWords w ON d.id=w.id AND w.word='sore'
INTERSECT
SELECT * FROM diagnose d
INNER JOIN diagnoseWords w ON d.id=w.id AND w.word='throat'
似乎对您的情况有帮助的另一种方法是 mysql自然语言搜索或简单的布尔文本搜索。这两种方法都需要FULLTEXT 索引才能工作。
您还可以使用带有查询扩展的全文搜索来提供“更多结果”功能
推荐阅读
- android - Android Firebase RecyclerView 获取项目
- python - 如何在 tensorflow 中读取 Keras 检查点?
- sql - 特定条件的更新顺序 - Oracle
- r - 为周和年创建向量
- r - efficiency in a row-wise for loop and implementation with purrr
- python - 从 conda 安装时无法在 FiPy 中调用示例
- javascript - Javascript 及其单线程
- python - 尝试从 JSON 文件中计算数组中的项目数
- swift - 带有存储字段的 Swift 枚举?
- python - _extra_files arg 在 torch.jit.save 中的正确用法是什么