2017-05-17 15 views
0

私は電子商取引プラットフォームの検索アルゴリズムに取り組んでいます。プラットフォームは異なる製品のバリエーションを作成することができ、製品のすべてのバリエーションはコンマ区切りの列に含まれます。ここにはすべてのフィールドがあります。カンマ区切りデータベース列の項目を検索

  1. product_id - 例えば1
  2. variation_combo - 例えば54,35,49(これらはコンマが異なるバリエーションのIDを分離している)
  3. product_name - 例えばここ

"をナイキがTシャツのブランド" であります何を達成したいのですか?

  • SELECT product_id FROM table where variation_combo contains 35 AND 54 AND 49
  • SELECT product_id FROM table where variation_combo contains 35 AND 54
  • SELECT product_id FROM table where variation_combo contains 49
+0

は決して、これまでにカンマ区切り値などのデータを格納しません。それはあなたに多くのトラブルを引き起こすだけです。 – jarlh

+0

このような 'variation_combo'を持つことは設計上の欠陥です。リスト値を詳細テーブルに格納することを検討してください。 –

+0

ええ、私はこれを知っています。しかし、私が取り組んでいるソフトウェアにはこの欠陥があり、今それを変更することは本当に難しいだろう。だから私たちはそれを続けていくことに決めました。 –

答えて

2

はこれを参照するために有効になります MySQL query finding values in a comma separated string

select product_id from table where find_in_set('35',variation_combo) <> 0 and 
find_in_set('54',variation_combo) <> 0 and find_in_set('49',variation_combo) <> 0 
+0

これは最適化の可能性を提供します。 [docs](https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set)を引用する:_ "最初の引数が定数文字列で、2番目の引数がはSET型の列で、FIND_IN_SET()関数はビット演算を使用するように最適化されています。"_ +1 –

+0

ありがとう@DmitryEgorov、私はあなたのソリューションが本当に好きでしたが、私はパフォーマンスをテストし、kapilのクエリは少し速くなりました:) –

+0

@omerFarooq:はい、同意してください、' find_in_set'はあなたのケースに一番​​合っています。記録:) –

2

あなたは

SELECT product_id FROM table where variation_combo LIKE '%35%' AND LIKE '%54%' AND LIKE '%49%' 

私はこれは私が強く、デザインを再することをお勧めしますと、詳細にリスト値を移動

+0

'variation_combo'の値が' 354'の場合はどうなりますか?私はそれが選択されるべきではないと思う。 –

+0

よく考えましたが、variation_comboに 154,135,145が含まれている場合、この製品は選択されていなくても選択されます。 –

+0

@DmitryEgorovと同じ考え –

1

役に立てば幸いLIKEキーワードを使用することができます表。

ただし、フィールドデザインのリストに完全に拘束されている場合は、RLIKEを使用してリスト内の値をチェックすることができます。 IDが英数字(またはより正確には001-01などの単語境界を含まない)の場合、単一のIDは\bID\b正規表現と一致する可能性があります。だからあなたの文は

SELECT product_id 
    FROM table 
    where variation_combo RLIKE '\\b35\\b' 
     AND variation_combo RLIKE '\\b54\\b' 
     AND variation_combo RLIKE '\\b49\\b' 

SELECT product_id 
    FROM table 
    where variation_combo RLIKE '\\b35\\b' 
     AND variation_combo RLIKE '\\b54\\b' 

SELECT product_id 
    FROM table 
    where variation_combo RLIKE '\\b49\\b' 
関連する問題