0

我有一个带有图像和标签的表格(称为tbl_images

image_file    image_tags
----------    ----------------------------
test.png      tag1 another_tag tag2
hi.jpg        tag9 tag1 another_tag qwerty

我将如何做到这一点:

  • 搜索“另一个”不返回任何内容
  • 搜索“tag1”返回 test.png 行
  • 搜索“tag1 another_tag”返回 test.png 行
  • 搜索“qwerty tag2”不返回任何内容

?

如,如果它们都出现在同一行的同一 image_tags 字段中,则可以使用完整的标签名称进行搜索并同时搜索多个标签。笔记:-

  • 我只在一个领域内搜索
  • 它是通过 PHP 搜索输入完成的(在 中检索$_GET['search_terms']
  • 我不能这样做LIKE '%tag9%,因为 tag9 可能出现在更大的标签中,例如Atag98,并且正如我所说,我只想要完全匹配的标签。
  • 我不能这样做LIKE ' tag9 '(注意前后的空格,)因为tag9可能出现在image_tags字段的开头(没有空格,所以不会匹配)
  • 我不能这样做,LIKE 'tag9 another_tag'因为我不知道 another_tag 是否在 tag9 之后,同样LIKE 'tag9%another_tag'出于同样的原因我不能这样做;tag9 也可以是更大标签的一部分(如前所述。)

另外,全文搜索是否适合这个?如果是这样,你能提供一个例子吗?

一个棘手的问题(无论如何对我来说;)任何帮助将不胜感激。

4

3 回答 3

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 问题。像这样规范化数据库时不需要全文搜索。

于 2012-04-10T22:24:41.857 回答
2

如果您的标签没有明确的分隔符,您需要进行正则表达式选择。

SELECT * FROM tbl_images WHERE image_tags REGEXP '[[:<:]]tag[[:>:]]'

[[:<:]] 和 [[:>:]] 标记标识 MySQL 中的单词边界......所以虽然 REGEX 选择可能比 LIKE 慢,但这仍然有效。

在此处阅读有关 MySQL REGEX 的更多信息:http: //dev.mysql.com/doc/refman/5.1/en/regexp.html

于 2012-04-10T22:26:18.707 回答
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;

您不需要像这里建议的那样为每个标签创建一个新行,因为这不是一个理想的选择。

于 2012-04-10T22:27:26.350 回答