【问题标题】:MySQL query to filter records containing any of the words in search stringMySQL查询过滤包含搜索字符串中任何单词的记录
【发布时间】:2016-06-20 05:01:47
【问题描述】:

我必须开发一个简单的搜索页面,将搜索字符串与 MySQL 表中的字段匹配。

假设数据库表是“records”并且考虑的字段是“record_title”。还说以下是行中的“record_titles”。

word1word2
word1 word3 word4
字 5 字 2 字 1
词6

现在在搜索表单中,假设用户提交搜索词,例如“word1 word7”、“word1”、“word1 word5”、“word1 word2”等,它应该返回在搜索词中至少包含一个词的记录标题。它不应该将搜索字符串作为子字符串,例如如果搜索词是“单词”,它不应该返回上述记录集中的任何记录。

我尝试了以下,但有时与单个单词不匹配。

MATCH(`recordTitle`) AGAINST ('+word1 +word2' IN BOOLEAN MODE);

如何使用它(或其他解决方案)来选择包含至少一个单词匹配的记录。

谢谢。

GUIR

【问题讨论】:

  • 您以哪种格式使用 SEARCH 关键字,或者您是否要搜索单个字符串,或者您是否获得一个字符串,其中多个单词之间用空格分隔 @GUIR ???
  • 抱歉,这里省略了换行符。
  • Done :) ,每一行代表一个连续的记录标题

标签: mysql boolean match mode against


【解决方案1】:

假设你有一个要搜索的字符串:

variableToBeSearched = 'word word2 word3';

首先,您必须使用分隔符 SPACE 将其拆分为一个数组(取决于您在 MySQL 中使用的语言)。 所以:

Array[0] = 'word'
Array[1] = 'word2'
Array[2] = 'word3'

然后迭代数组并构建查询字符串。

string Query = "SELECT * FROM records WHERE ";
if(Array.Length != 0)
{
    For(i=0; i<Array.Length; i++)
    {
        if( i != (Array.Length-1) )
        {
            Query += "record_title LIKE '%" + Array[i] + "% ' OR ";
        }
        else
        {
            Query += "record_title LIKE '%" + Array[i] + "% '";
        }
    }
}
else
{
    // No words found in the String :-)
}

然后执行QUERY。请告知是否需要从我这边清除一些理解。

【讨论】:

  • 由于我不知道您在 MySQL 中使用的特定语言,所以我编写了 Psuedo-Code。 @GUIR
  • 谢谢。这行得通。但在我的情况下,我不需要搜索字符串作为数据库记录的子字符串。它应该只匹配任何一个或多个完整的“单词”,而不是数据库记录中单词的子字符串。例如说搜索词是“超级”,如果我们在数据库中有一个词“取代”,它应该是匹配的搜索字符串。但是,如果数据库有记录“超级指挥”,则应该匹配,因为这里“超级”是一个完整的单词而不是子字符串。
  • 我明白你的意思。那么让我澄清一些事情。谁在 TABLE @GUIR 中输入了 record_title COLUMNS 数据。如果您手动执行,则在 COLUMN 中手动输入单词,例如 'superconductor ' AND 'supersede ' 。记下每个字符串末尾的空格(甚至是字符串中最后一个单词之后的空格)。然后使用 Query += "record_title LIKE '%" + Array[i] + " %'"; 更新 ANSWER 查询,最后有一个空格。
  • 我希望你明白我所说的@GUIR
  • 谢谢,我会测试一下
【解决方案2】:

其实你可以使用 sql in 运算符 - http://www.w3schools.com/sql/sql_in.asp 和 php implode 函数使数组的逗号分隔字符串在您的 sql 字符串中使用。

$searchArr = implode(', ', $arraySearch); 
$sql = "select * from records where record_title in ($searchArr);"; 

【讨论】:

  • 他也想在每个 Array-Row 中搜索用 SPACE 分隔的字符串。所以 LIKE 是必须的
  • 谢谢。我将进一步解释,但稍后。请参阅下面的 @MalikAsif 的 cmets。
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多