【问题标题】:How to search MySQL database with an array of strings?如何使用字符串数组搜索 MySQL 数据库?
【发布时间】:2019-03-29 08:12:47
【问题描述】:

这是一个带有 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);
        });
    }

【问题讨论】:

    标签: mysql node.js


    【解决方案1】:

    实现这一目标的最简单但不是最有效的方法是:

    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 提供“更多结果”功能

    【讨论】:

    • 感谢您的回答。这样做的问题是,这些值不会每次都相同,用户会一直输入不同的值。
    • 这很简单:构建 sql 语句动态替换变量的值。为了简单起见,我保留了这些值。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2021-09-15
    • 2014-07-28
    相关资源
    最近更新 更多