2016-10-24 12 views
0
  • 私はユーザーの質問を保持するMySQLテーブルを持っています。
    • 各ユーザーにはカテゴリが割り当てられています。
    • 各質問は、1つ以上のユーザーカテゴリを対象とすることができます。
    • 質問カテゴリは質問テーブルの列にあり、 は別のテーブルにありません。複数のユーザーカテゴリをターゲット質問について
    • 、各カテゴリは、私は特定のユーザーのカテゴリがあることと一致して、テーブルからすべての質問を取得しようとしているように|

などの文字で区切られます質問のカテゴリ欄にある文字列の文字列内の一致する単語

私は夫婦の問題に遭遇しました:私はと比較しようとしている文字列は、私はいくつかのカテゴリのでWHERE category LIKE "%'.$category.'%"を使用することはできません

Retail|Field Basedのようなものかもしれないので

$string^は動作しません。 は単語を共有します。たとえば:カテゴリだったRetailRetail RoadshowRetail場合、私は、現在のデータベース構造でこれを行う方法についての損失のビットでよ

Retail Roadshowに、それもマッチします。私はデータベースの構造を変更するつもりはないが、現在どのように動作しているかについての正しい答えを得ることができない場合があります。

+3

あなたの本能は正しいです.MySQLテーブルには区切られたデータが含まれてはいけません。それぞれの値は別のタブの行に存在するはずですe。この原則に従い、出会いの危機にある多くの問題がなくなります。 –

+2

パイプの区切り文字を '|'にしたい場合は、 '$ sql =" select * from your_tableを実行します。ここで、category = '$ category'または '$ category |%'やcategory LIKE '%| $ category |% 'または'%| $ category 'のようなカテゴリ "; – MonkeyZeus

+0

ユーザカテゴリに実際にカテゴリ名にパイプがあるとどうなりますか? – MonkeyZeus

答えて

0

既に説明したように、データベースはテーブルで最も効果的です。

しかし、議論のために、DBリファクタを使用せずに目標を達成する方法を見てみましょう。

まず、すべてのパイプをカンマで置き換える必要があります。

replace(column, '|', ',') 

結果にFIND_IN_SET使用:

find_in_set('Retail', replace(column, '|', ',')) 

MySQLのインデックスが1で始まり、あなたがRrtailはとの列に存在するかどうかを確認することができます

find_in_set('Retail', replace(column, '|', ',')) > 0 
2

あなたは3つの選択肢があります。

1)ワイルドカードマッチングを単語単位のビジネスに分割します。

foo LIKE '%bar baz%' - >foo LIKE '%bar%' AND foo LIKE '%baz%'

2)フルテキストインデックスを使用し

foo like '%bar baz%' - >MATCH(foo AGAINST 'bar baz')

3)またはあなたのテーブルを正規化するので、各キーワードは、独自の子レコードです:

JOIN keywords ON ... 
WHERE keywords.word IN ('bar', 'baz') 
+0

ここでは正規化オプションが最適です。 「LIKE」は悪名高く遅いです。 – tadman

+0

番号。それはそれ自身のようなものではありません。それはアンカーレスワイルドカードです。インデックスの使用が不可能であるため、 '%foo%'は遅いです。 'foo%'は(一般的に)インデックスを使用できます。 'like 'foo''は' field =' boo''と等価です。 –

+0

真ですが、アンカーなしで 'LIKE'を使うとかなり無意味です。 – tadman

関連する問題