この値を持つフィールド(「役割」)があります
roles
row_1: 1,2,3,5
row_2: 2,13
私はこれをします:
SELECT * FROM bloques WHERE 2 IN (roles)
2 から始まるため、row_2 のみを検索します。
1 を見つけた場合、LIKE オプションは機能しません。
SELECT * FROM bloques WHERE roles LIKE '%1%'
、それは私に両方の行を与えます。
この値を持つフィールド(「役割」)があります
roles
row_1: 1,2,3,5
row_2: 2,13
私はこれをします:
SELECT * FROM bloques WHERE 2 IN (roles)
2 から始まるため、row_2 のみを検索します。
1 を見つけた場合、LIKE オプションは機能しません。
SELECT * FROM bloques WHERE roles LIKE '%1%'
、それは私に両方の行を与えます。
FIND_IN_SET関数 cal は次のことに役立ちます。
SELECT FIND_IN_SET('b','a,b,c,d');
あなたのコードのために:
SELECT * FROM bloques WHERE FIND_IN_SET(2,roles);
また、スキーマを1NFに移動することをお勧めします
SELECT
*
FROM
bloques
WHERE
roles LIKE '%,2,%'
OR roles LIKE '2,%'
OR roles LIKE '%,2'
最初のケースは、2がセットの途中にあるすべてのケースを示し、2番目のケースは、2がセットを開始するとき、3番目のケースは2がセットを終了するときです。これはおそらくひどく非効率的ですが、機能するはずです。
FIND_IN_SET()関数を使用する
これを試して:
SELECT * FROM bloques WHERE FIND_IN_SET(1, roles);
また
SELECT * FROM bloques
WHERE CONCAT(',', roles, ',') LIKE '%,1,%';
ここでこの正規表現を使用できます:
SELECT * FROM bloques
WHERE roles REGEXP '[[:<:]]2[[:>:]]';
...または、より一般的な場合:
SELECT * FROM bloques
WHERE roles REGEXP CONCAT('[[:<:]]', :your_value, '[[:>:]]');
これらは単語の境界と一致するため、これらの奇妙な外観のものを使用する必要があります。「2」の一致が「23」と「32」で発生するのを防ぎます。)。
問題は、クエリが非正規化フィールドの使用によって引き起こされる問題の始まりにすぎないことです。SETタイプ(オプションの数が限られていて少ない場合)、またはより良い方法として、mn関係を格納するためのジャンクションテーブルを使用することをお勧めします。
REGEXP を使用できますか? http://dev.mysql.com/doc/refman/5.1/en/regexp.html
それ以外の場合は、行の前後にコンマを追加できます。
select * from mytable where ',' + roles + ',' like '%,2,%'