我正在尝试从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[[:>:]]'
谢谢!
答案 0 :(得分:2)
首先,您可以考虑在布尔模式下进行全文搜索。这可能比任何基于字符串的解决方案都要好。
也就是说,您可以通过使用分隔符包围标记和搜索字符串来执行您想要的操作:
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;