我有一行以这种方式包含关键字(keyword1,keyword2,keyword3),用逗号分隔,如图所示。当用户登录时,您知道他想要有关(keyword1,keyword3)的信息。现在,我有另一个表,其中包含与不同关键字相关的大量信息,此表有一行称为(关键字),表示此信息是否适合哪个关键字。如何根据关键字为用户呈现所需信息。
换句话说,如果用户想要关于(keyword3,keyword1)的信息,我该如何进入(信息)表并查找行中包含单词(keyword1)或单词(keyword3)的所有信息(关键字)?
对不起,如果这很复杂(我的解释),但我尽力解释。
提前谢谢你:)
答案 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'