如何在MYSQL中连续搜索特定单词?

时间:2010-06-17 19:01:11

标签: php mysql

我有一行以这种方式包含关键字(keyword1,keyword2,keyword3),用逗号分隔,如图所示。当用户登录时,您知道他想要有关(keyword1,keyword3)的信息。现在,我有另一个表,其中包含与不同关键字相关的大量信息,此表有一行称为(关键字),表示此信息是否适合哪个关键字。如何根据关键字为用户呈现所需信息。

换句话说,如果用户想要关于(keyword3,keyword1)的信息,我该如何进入(信息)表并查找行中包含单词(keyword1)或单词(keyword3)的所有信息(关键字)?

对不起,如果这很复杂(我的解释),但我尽力解释。

提前谢谢你:)

7 个答案:

答案 0 :(得分:2)

在SQL查询中使用MySQL FIND_IN_SET function,如下所示:

 FROM TABLE t
WHERE FIND_IN_SET(t.keywords, 'keyword1, keyword3') > 0

答案 1 :(得分:2)

请规范化您的表格,并对单个字段中逗号分隔值非常怀疑。更灵活的设置将是:

用户
ID
名字

<强>关键字
id(或仅使用名称作为主键)
命名
......

<强> USER_KEYWORDS
USER_ID
keyword_id

<强>信息
ID
数据

<强> INFORMATION_KEYWORDS
information_id
keyword_id

您的查询结果如下:

SELECT information.data
FROM users
JOIN user_keywords ON user_keywords.user_id = users.id
JOIN information_keywords ON information_keywords.keyword_id = user_keywords.keyword_id
JOIN information ON information_keywords.information_id = information.id
WHERE users.id = <id>

答案 2 :(得分:1)

数据库设计的第一条规则:每行存储一个值。

换句话说,您应该修改数据库以将每个关键字存储在单独的行中。

答案 3 :(得分:1)

您是否考虑过更改数据模型?

目前,您在一列中有一个迷你表。也就是说,关键字列包含多个值,以逗号分隔。您将很难匹配这些关键字。

更好的解决方案是制作表UserKeywords:

User    Keyword
Paul    snacks
Paul    food
Paul    beer
Kelly   snacks
Kelly   wine

这样,您可以根据信息和用户表加入此表。

答案 4 :(得分:1)

Sjoerd是对的。关系数据库设置绝对是最佳解决方案。 我不确定MySQL FIND_IN_SET(),但你可以解析你的用户关键字并撰写一个字符串,这样你的搜索查询最终会像这样:

SELECT * FROM `information` WHERE MATCH(`keyword`) AGAINST('keyword1 keyword3' IN BOOLEAN MODE)

在这种情况下,如果匹配任何一个匹配,则应该返回。

您应该记住,“关键字”列必须是全文索引,以便与工作匹配,并且匹配仅适用于服务器上php.ini配置中定义的最小字符数。在大多数情况下,默认值为4个字符。 换句话说,您的关键字必须是4个字符或更多才能使用匹配。 话虽这么说,你可以设置你的查询字符串来做这样的事情:

$user_keywords = array('keyword1', 'keyword3');

if(count($user_keywords) == 1)
{
    $word = $user_keywords[0];

    if(strlen($word) >= 4)
    {
        $query_str = "MATCH(`keyword`) AGAINST ('".$word."' IN BOOLEAN MODE)";
    }
    else
    {
        $query_str = "`keyword` LIKE '%".$word."%'";
    }

}
else
{
    $query_str = "";
    foreach($user_keywords AS $key)
    {
        $query_str .= "`keyword` = '".$key."' OR ";
    }
    $query_str = substr($query_str, 0, -3);
}

$sql = "SELECT * FROM `information` WHERE ".$query_str;

无论你采用哪种方式,你都应该开始将数据库转换为关系设置,除非你没有选择 - 比如你使用的是你没有编码的第三方软件包,转换它将需要永远。

此外,%作为部分匹配的示例。如果您需要更多解释,请告诉我们。

答案 5 :(得分:0)

答案 6 :(得分:0)

在进行关键字类型查询时(希望按照sjoerd解释的每行一种方法,我很喜欢MySql不经常使用的REGEXP功能。类似于,它可以对所有字符进行部分搜索一个类似数据的单元格,没有搜索查询各个部分所需的所有特殊字符。可以将其视为Google for MySql

一个例子:

SELECT * from TABLE WHERE value REGEXP'foo'