3

この値を持つフィールド(「役割」)があります

        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%'

、それは私に両方の行を与えます。

4

5 に答える 5

3

FIND_IN_SET関数 cal は次のことに役立ちます。

SELECT FIND_IN_SET('b','a,b,c,d');

あなたのコードのために:

SELECT * FROM bloques WHERE FIND_IN_SET(2,roles);

また、スキーマを1NFに移動することをお勧めします

于 2012-12-19T14:28:27.393 に答える
0
SELECT 
  * 
FROM 
  bloques 
WHERE 
  roles LIKE '%,2,%' 
  OR roles LIKE '2,%' 
  OR roles LIKE '%,2'

最初のケースは、2がセットの途中にあるすべてのケースを示し、2番目のケースは、2がセットを開始するとき、3番目のケースは2がセットを終了するときです。これはおそらくひどく非効率的ですが、機能するはずです。

于 2012-12-19T14:30:25.027 に答える
0

FIND_IN_SET()関数を使用する

これを試して:

SELECT * FROM bloques WHERE FIND_IN_SET(1, roles);

また

SELECT * FROM bloques 
WHERE CONCAT(',', roles, ',') LIKE '%,1,%';
于 2012-12-19T14:30:33.447 に答える
0

ここでこの正規表現を使用できます:

SELECT * FROM bloques 
  WHERE roles REGEXP '[[:<:]]2[[:>:]]';

...または、より一般的な場合:

SELECT * FROM bloques 
  WHERE roles REGEXP CONCAT('[[:<:]]', :your_value, '[[:>:]]');

これらは単語の境界と一致するため、これらの奇妙な外観のものを使用する必要があります。「2」の一致が「23」と「32」で発生するのを防ぎます。)。

問題は、クエリが非正規化フィールドの使用によって引き起こされる問題の始まりにすぎないことです。SETタイプ(オプションの数が限られていて少ない場合)、またはより良い方法として、mn関係を格納するためのジャンクションテーブルを使用することをお勧めします。

于 2012-12-19T14:30:46.043 に答える
0

REGEXP を使用できますか? http://dev.mysql.com/doc/refman/5.1/en/regexp.html

それ以外の場合は、行の前後にコンマを追加できます。

select * from mytable where ',' + roles + ',' like '%,2,%'
于 2012-12-19T14:28:03.623 に答える