1

次のようなコンマ区切りのタグのリストを含む「tags」というフィールドがあります。

ios, ios development, freelance, new_project

フィールドにクエリを実行して、値「ios」がコンマ区切りリストにあるかどうかを確認したいと思います。どうすればこれができるか教えてください。

4

3 に答える 3

5

MySQLでは、次を使用できますFIND_IN_SET()

SELECT * FROM mytable WHERE FIND_IN_SET('ios ', tags) > 0;

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

FIND_IN_SET文字列はコンマとスペースで区切られるのではなく、コンマで区切られる必要があることに注意してください。したがって、最後のタグに問題がある可能性があります。本当に最善の方法は、テーブルを正規化することです。そうしないと、列からスペースを消去する可能性があります。最後に、列にスペースを追加することで問題を回避できます。tagstags

SELECT * FROM mytable WHERE FIND_IN_SET('ios ', CONCAT(tags,' ')) > 0;

タグの数が限られている場合は、列をに変換することを検討してくださいSET。これにより、効率が大幅に向上します。

アップデート

スペースを間違えた以外は。それらは文字列の前にあり、後ではありません。

それで:

SELECT * FROM mytable WHERE FIND_IN_SET(' ios', CONCAT(' ', tags)) > 0;

しかし、繰り返しますが、それらのスペースを取り除きます-それらはトラブルに他なりません:-)

更新2

上記はうまくいきます。しかし、それはあなたが私の好意で言うことができるほとんどすべてです。このソリューションは非常に非効率的であるだけでなく、システムを保守不可能な状態にします(そこで、Tシャツとかみ砕いたお尻を同じものの下に置きます)。したがって、正規化を支持するために少しハープします。つまり、少なくとも次の2つのテーブルを追加します。

CREATE TABLE tags ( id      INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
                    tagName varchar(32) // I'm a bit of a cheapskate
);
CREATE TABLE has_tag ( tableid INTEGER, tagid INTEGER );

これはどれくらい良いですか?方法を数えましょう。

  • より柔軟なクエリを簡単に追加できます(「iOS、C ++、...にすべてのタグがあります」または「これらの中に少なくとも3つのタグがあります:(iOS、Python、SQL、.NET、Haskell)」。はい、できますこれでFIND_IN_SET、しかし私を信じてください、あなたはそれを楽しむことはありません
  • タグの制御された辞書があり、タグが既知であるかどうかを確認できます(また、ドロップダウンコンボボックスなどのリストを簡単に生成できます。または、誰かが「jQueryオートコンプリート」と言いましたか?)。
  • 一部のディスク領域を節約します(タグは1回書き込まれます)
  • 検索は高速です。探しているタグがすでにわかっていて、それらをタグIDにプリコンパイルしている場合は、実行時にSQLラバースコーチマークが舗装に残ります(整数値のインデックス検索!)。また、コンパイルされないタグは存在しないため、検索を開始する前でもこれを知ることができます。
  • タグの名前変更がはるかに簡単になります
  • 任意の数のタグを保持できます(遅かれ早かれ「iOSDevelopm」に切り捨てられるタグがあるリスクがあります...)

「CSVフィールド」は、SQLアンチパターンhttp://pragprog.com/book/bksqla/sql-antipatterns)の間で検閲されていると思いますが、これには正当な理由があります。

于 2012-08-27T20:38:28.803 に答える
1

以下は、カンマ区切りのリストに適した簡単な方法です。

select *
  from mytable
 where concat(', ', tags, ',') like concat(', %ios%,')
于 2012-08-27T20:36:59.303 に答える
0

最初(単純):

WHERE tags LIKE '%ios,%'
于 2012-08-27T20:37:16.610 に答える