php - MYSQL - 从标签搜索中仅检索完整单词

标签 php mysql regex database

我正在尝试从 mysql 数据库检索条目,其中数据库中的关键字对应于文章的标题或文章的标签。目前我正在使用 instr,但这还不够具体,因为我发现对于较短的关键字检索到了太多不相关的结果 - 即。我尝试检索标题或标签列表中包含“艺术”一词的条目,但最终检索到带有“文章”等单词的其他条目。

我有以下表结构。数据库有一个预定义的标签列表。每个文章类别都分配了主标签列表中的多个标签:

tags_tbl (overall tags list)

    tt_tag_id (pk) int

    tt_tag  varchar

category_tag_assignments_tbl (the category which a tag is assigned to)

    cta_id (pk) int

    cta_tag_for_id (fk to tags_tbl.tt_tag_id) int

    cat_for_id (fk to category table) int

我的查询是:

SELECT * FROM tags_tbl INNER JOIN category_tag_assignments_tbl ON tags_tbl.tt_tag_id = category_tag_assignments_tbl.cta_tag_for_id WHERE instr('The Article Title' , tags_tbl.tt_tag) > 0 OR instr('these,are,article,tags' , tags_tbl.tt_tag) > 0 

我怎样才能做到这一点,以便我可以在文章标题和文章标签内搜索完整的单词,而不检索字符串也可能出现的较长单词,同时还考虑到以下事实:标签列表是用逗号分隔的,没有空格吗?我想最大限度地减少 php 处理量 - 我无法控制标题和标签的实际呈现,因为这些是由外部源提供的,除非我提前用 php 修改它们。

我正在考虑合并以下正则表达式,这是我在 stackoverflow 上找到的,但我不知道如何在这种情况下应用它,因为我正在我的搜索词中进行搜索(抱歉,我知道措辞笨拙,但我可以想不出还能怎么说):

WHERE tags_tbl.tt_tag REGEXP '[[:<:]]art[[:>:]]'

谢谢!

最佳答案

首先,您可以考虑 bool 模式下的全文搜索。这可能比任何基于字符串的解决方案表现更好。

也就是说,您可以通过用分隔符包围标签和搜索字符串来执行您想要的操作:

SELECT *
FROM tags_tbl INNER JOIN
     category_tag_assignments_tbl
     ON tags_tbl.tt_tag_id = category_tag_assignments_tbl.cta_tag_for_id
WHERE concat(' ', 'The Article Title', ' ') like concat('%', tags_tbl.tt_tag, '%')OR
      concat(',', 'these,are,article,tags', ',') like concat('%', tags_tbl.tt_tag, '%')

最后一个表达式实际上可以通过使用 find_in_set() 来简化,对于以下 where 子句:

WHERE concat(' ', 'The Article Title', ' ') like concat('%', tags_tbl.tt_tag, '%')OR
      find_in_set(tags_tbl.tt_tag, 'these,are,article,tags') > 0

您实际上也可以将它用于第一个表达式 - 如果标题中有逗号,这会很方便:

WHERE find_in_set(tags_tbl.tt_tag, replace('The Article Title', ' ', ',') or
      find_in_set(tags_tbl.tt_tag, 'these,are,article,tags') > 0;

关于php - MYSQL - 从标签搜索中仅检索完整单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666164/

相关文章:

php - Symfony2 自引用多对多关系

mysql - 想在UPDATE后写一个触发器

php - 如何保护 SQL 查询的输入安全?

c# - 从c#中的字符串中拆分数字

javascript - 删除某些单词,直到出现一组不同的单词

php - 如何避免向 MySQL 中插入重复项?

php - Symfony3 在类型文件中创建没有实体的表单

php - 根据 Woocommerce 中的产品类别隐藏价格

c# 获取或设置预期的访问器

PHP 正则表达式字母数字受非字母数字限制