Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
搜索php+mysql关闭词?_Php_Mysql_Search_Tags - Fatal编程技术网

搜索php+mysql关闭词?

搜索php+mysql关闭词?,php,mysql,search,tags,Php,Mysql,Search,Tags,首先对不起我的英语 我在数据库中有一个标签字段,我正在像这样搜索 SELECT * FROM table WHERE tags LIKE '%$keyword%' and tags LIKE '%$keyword%' 我把标签按空格分开 america england france 我想给你看看我的桌子结构 id | title | tags 1 title1 america france 2 title2 american english 3 title3

首先对不起我的英语

我在数据库中有一个标签字段,我正在像这样搜索

SELECT * FROM table WHERE tags LIKE '%$keyword%' and tags LIKE '%$keyword%'
我把标签按空格分开

 america  england  france 
我想给你看看我的桌子结构

id | title | tags

1    title1  america france
2    title2  american english
3    title3  england  french
例如,当我想搜索美国时

结果是标题1和标题2,因为美国和美国标签看起来一样 字

我怎样才能使它们独一无二?当我搜索美国时,结果应该只有标题1

谢谢你的帮助,希望你能理解我的问题。。祝你今天愉快

编辑:


多亏了Akam,他写了一个解决方案

您可以使用这样的东西:

SELECT *
FROM tbl
WHERE CONCAT(' ', tags, ' ') LIKE CONCAT('% ', 'america', ' %')
SELECT * FROM table WHERE tags REGEXP '[[:<:]]$keyword[[:>:]]';

请参阅fiddle。

您也可以使用MySQL的REGEXP,而不是像使用单词边界修饰符那样只匹配整个单词。您的查询如下所示:

SELECT *
FROM tbl
WHERE CONCAT(' ', tags, ' ') LIKE CONCAT('% ', 'america', ' %')
SELECT * FROM table WHERE tags REGEXP '[[:<:]]$keyword[[:>:]]';
这样做的额外好处是,如果您需要:

SELECT * FROM table WHERE tags REGEXP '[[:<:]]$keyword_one[[:>:]]|[[:<:]]$keyword_two[[:>:]]'
请注意REGEXP条件中两个表达式之间的pipe |字符,这意味着它将匹配至少与其中一个标记匹配的任何记录

我还没有亲自测试过这种方法的性能,但在其他StackOverflow文章中读到,它几乎相当于一个开头带有%通配符的LIKE,因为这种类型的查询将导致MySQL不使用索引。所以我想这是你最好的选择


更多信息:

您可以简单地使用“关键字%”之类的标签添加一个空格?谢谢您的帮助。。祝你有愉快的一天那是个糟糕的桌子结构。你应该规范化设计。每个标记在其自己的记录中。如果相关标记位于字段的开头或结尾,并且没有前导/尾随空格,则该记录将失败。@MarcB我在类似的两侧添加了前导/尾随空格,我认为它不会失败