我有一张包含图片和标签的表格(称为tbl_images
)
image_file image_tags
---------- ----------------------------
test.png tag1 another_tag tag2
hi.jpg tag9 tag1 another_tag qwerty
我该怎么做才能:
用于搜索完整标记名称并同时搜索多个标记的能力,如果它们全部出现在同一行的同一image_tags字段中。 注意: -
$_GET['search_terms']
中检索)LIKE '%tag9%
,因为tag9可能会出现在较大的标记中,例如Atag98
,而且正如我所说,我只希望完全标记匹配。 LIKE ' tag9 '
(注意前后空格),因为tag9可能出现在image_tags字段的开头(没有空格,所以没有匹配)LIKE 'tag9 another_tag'
,因为我不知道另外一个标签是否在tag9之后,同样我也不能{i} LIKE 'tag9%another_tag'
出于同样的原因; tag9也可以是更大标签的一部分(如前所述。)此外,全文搜索是否适用于此?如果是这样,你能提供一个例子吗?
一个棘手的问题(无论如何;)任何帮助将不胜感激。
答案 0 :(得分:7)
使用图像存储标签的更好解决方案是创建一个单独的表,其中标签链接到图像。然后,您将为每个标记创建一行,例如
image_file (FK) tag
--------------- -----------
test.png tag1
test.png another_tag
test.png tag2
hi.jpg tag9
hi.jpg tag1
hi.jpg another_tag
hi.jpg qwerty
然后,您可以只查找与图像相关的标签:
SELECT tag FROM tags WHERE image_file = 'test.png'
或哪些图片与某个标签相关:
SELECT image_file FROM tags WHERE tag = 'tag1'
使用此方法可以避免您在问题中描述的LIKE的所有问题。在像这样规范化数据库时,不需要全文搜索。
答案 1 :(得分:2)
如果您的代码没有明确的分隔符,则需要进行正则表达式选择。
SELECT * FROM tbl_images WHERE image_tags REGEXP '[[:<:]]tag[[:>:]]'
[[:&lt ;:]]和[[:&gt;:]]标记识别MySQL中的单词边界...所以虽然REGEX选择可能比LIKE慢,但这仍然有用。
在此处阅读有关MySQL REGEX的更多信息:http://dev.mysql.com/doc/refman/5.1/en/regexp.html
答案 2 :(得分:0)
如果所有标记都被空格分隔,请将它们分解为数组,然后在数组中搜索您要查找的关键字。如果找到关键字,请抓住该行。
我不知道你在这里使用的语言是它应该如何:
loop all rows:
get values of the current row:
tags = array of the tags cell, explode ' '
foreach (tag in tags):
if (tag == keyword)
save current row info
end foreach;
end loop;
您不需要为每个标记创建一个新行,就像这里建议的那样,因为这不是一个理想的选择。