次のようなコンマ区切りのタグのリストを含む「tags」というフィールドがあります。
ios, ios development, freelance, new_project
フィールドにクエリを実行して、値「ios」がコンマ区切りリストにあるかどうかを確認したいと思います。どうすればこれができるか教えてください。
次のようなコンマ区切りのタグのリストを含む「tags」というフィールドがあります。
ios, ios development, freelance, new_project
フィールドにクエリを実行して、値「ios」がコンマ区切りリストにあるかどうかを確認したいと思います。どうすればこれができるか教えてください。
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
文字列はコンマとスペースで区切られるのではなく、コンマで区切られる必要があることに注意してください。したがって、最後のタグに問題がある可能性があります。本当に最善の方法は、テーブルを正規化することです。そうしないと、列からスペースを消去する可能性があります。最後に、列にスペースを追加することで問題を回避できます。tags
tags
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 );
これはどれくらい良いですか?方法を数えましょう。
FIND_IN_SET
、しかし私を信じてください、あなたはそれを楽しむことはありません。「CSVフィールド」は、SQLアンチパターン(http://pragprog.com/book/bksqla/sql-antipatterns)の間で検閲されていると思いますが、これには正当な理由があります。
以下は、カンマ区切りのリストに適した簡単な方法です。
select *
from mytable
where concat(', ', tags, ',') like concat(', %ios%,')
最初(単純):
WHERE tags LIKE '%ios,%'