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 フィールドにある場合に同時に検索する機能。ノート:-

  • 1 つのフィールド内のみを検索しています
  • PHP検索入力(で取得$_GET['search_terms'])で行われます
  • LIKE '%tag9%tag9 は、 などのより大きなタグに表示される可能性があるため、実行できません。前述のとおり、正確なタグの一致Atag98のみが必要です。
  • image_tags フィールドの先頭に tag9 が表示される可能性があるため (スペースがないため、一致しない可能性があります)、できませんLIKE ' tag9 '(前後のスペースに注意してください)。
  • 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 に答える