这是针对使用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);
});
}
答案 0 :(得分: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才能起作用。
提供“更多结果”功能