mysql - 如何使用字符串数组搜索 MySQL 数据库?

标签 mysql node.js

这适用于带有 NodeJS 的 Discord 机器人。所以我有一个名为 args 的数组,其中包含调用命令时用户传递的参数。我想要做的是在“症状”列下搜索数据库并将这些行返回。但我只想要那些包含数组中单词的。例如,我发送命令“疼痛,喉咙痛”,然后机器人会将其转换为数组。然后我想让它用包含这些词的任何东西搜索数据库,但它不必按那个顺序,所以就像该行可以说“喉咙痛,头痛,疼痛”它仍然会选择那个,因为它至少包含这两个参数。

我尝试了以下解决方案:

SELECT * FROM diagnostic WHERE Symptoms IN (${args})

但是如果其中只有一个词(那个词是咳嗽,没有别的,如果有另一个词它不会显示),那只会返回一行。

SELECT * FROM diagnostic 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 natural language search或者只是一个 boolean text search . 这两种方法都需要 FULLTEXT index去工作。

您还可以使用 full-text searches with query expansion 提供“更多结果”功能

关于mysql - 如何使用字符串数组搜索 MySQL 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55413036/

相关文章:

mysql - Sql 语句作为 mySQL 数据库中的数据

MySQL:在结果中显示未找到的字符串

php - 在 HandlerSocket 上基于原始套接字的查询中表示 NULL 键值的正确方法

node.js - 在 Jenkins 中运行 grunt 时无法解析的 NodeJS 安装程序

javascript 变量到 ejs

MySQL 外键错误

mysql - 管理商店结帐流程的并发性

node.js - Nodejs 传递 res.end() 作为回调不起作用

javascript - Electron-dl 使用 promise.all 进行多个同时下载

node.js - 如何循环遍历 Node.js 数组