2011-08-12 7 views
3

カテゴリを格納するデータベーステーブルにファイルがあります。私は、カテゴリ1から製品を検索しようとしたとき、私は、このようなMysqlのLIKE句に代わるもの

where (prod_catg LIKE %1,% or prod_catg LIKE %1% or prod_catg LIKE %,1%)

としての私のクエリで LIKE句を使用 、今

1,12,15

:私は、次の形式でカテゴリを格納しています

これは3つのカテゴリ1,12と15のすべての商品を返します。代わりにカテゴリ1の商品がほしいだけです。

試しましたIN句が見つかりませんでした。

誰でも私に他の選択肢を提案できますか?

+4

あなたはscemaをテーブル 'category'を追加して正規化してから、それをメインテーブルで参照するべきです – Dalen

答えて

5
prod_catg LIKE '1,%' --matches when 1 is the first category 
OR prod_catg LIKE '%,1,%' --matches when 1 is somewhere in the middle 
OR prod_catg LIKE '%,1' --matches 1 when is the last category 

は、とにかくあなたが

EDIT

にこの問題に直面する別の方法をカテゴリテーブルおよび製品上のそれへの参照を追加して、スキーマをリファクタリングすることをお勧めしていた(メイン)テーブルですREGEXPを使用すると、短いWHERE句につながるであろう(ここで私がテストするために使用してきたものです):

DECLARE @regexp VARCHAR(100); 
SET @regexp = '^1,.*|.*,1$|.*,1,.*'; 

SELECT 
    '1,11,15,51,22,31' REGEXP @regexp AS test1, 
    '51,11,15,1,22,31' REGEXP @regexp AS test2, 
    '11,15,51,22,31,1' REGEXP @regexp AS test3, 
    '7,11,15,51,22,31' REGEXP @regexp AS test4, 
    '51,11,15,7,22,31' REGEXP @regexp AS test5, 
    '11,15,51,22,31,7' REGEXP @regexp AS test6; 

これはあなたのprod_catgと、正規表現'^1,.*|.*,1$|.*,1,.*'と一致します。一致する場合は0 (FALSE)となります。returnig 1 (TRUE)

は、その後、あなたの句は次のようになりますWHERE:正規表現の

WHERE prod_catg REGEXP '^1,.*|.*,1$|.*,1,.*' 

説明:

^1,.* --matches 1 at the beginning of a string followed by a `,` and any other char 
.*,1$ --matches 1 at the end of a string preceded by a `,` and any other char 
.*,1,.* --matches 1 between two `,` which are sourrounded by any other chars 
| --is the OR operator 

私はこの正規表現は、はるかにコンパクトにすることができ確信しているが、私は定期的に良いことではありませんよ式

また、正規表現で探しているカテゴリを変更することもできます(17に置き換えてください)上のファイル)

3

の製品とカテゴリの関係はです。各製品の対応するカテゴリ(cat_ids)を格納するための新しいテーブルを作成する必要があります。複数のカテゴリIDを含む列を持つべきではありません。あなたの選択はずっと簡単でずっと速くなります。

3
WHERE FIND_IN_SET('1', prod_catg)