2017-03-22 2 views
0

'items'という名前のテーブルがあります。 以下のようなインデックス列を含む列があります。私は(消防署、USER2)を取得することはできませんSQL:in節の間にデータをフェッチする方法

title  | name | areacode 
--------------------------------- 
police  | user1 | 31,31,31 
FireStation | user2 | 31,1,2 
Restaurant | user22 | 1,1,0,32,32 
--------------------------------- 

私は声明

select title, name from items where IN(31) 

の下に使用したときに私が使用したとき、私はしかし(警察、USER1)及び(消防署、USER2) を取得する(1)

iは、IN句が有用であることが判明したときに、このような

IN(31,1) 
として複数の値210

が使用されます。

しかし、IN(1)やIN(0)などの単一の値では、データを正しくフェッチしないことがあります。私はCONTAINSメソッドを見つけました。しかしそれに精通していない。

つまり、areacodeに値 '1'が含まれていると、(FireStation、user2)をフェッチできますか? areacodeの値が '0'のときは(Restaurant、user22)?

+0

をし、すべての市外局番を1つのテーブルに配置し、次に第3のテーブルを使用してarea_codeをアイテムに接続する必要がある多数のテーブル関係船に属します。この結合テーブルは、(id、area_code_id、item_id)のようになります。最初はややこしいかもしれませんが、長期的にはエリアコードやアイテムを管理して照会するのが簡単になります。 –

答えて

1

市外局番データは非正規化されているため、扱いにくいため、地域コードデータをCSV形式で保存しないでください。つまり、MySQLにはFIND_IN_SET()という機能があり、指定された値がCSV文字列に含まれているかどうかを確認できます。このような何かが動作するはずです:

SELECT title, name 
FROM items 
WHERE FIND_IN_SET('0', areacode) > 0 

あなたは両方0または1エリアコードをチェックしたい場合は、このWHERE句使用することができます:私は持っているの実装を見てみなければなりません

WHERE FIND_IN_SET('0', areacode) > 0 OR FIND_IN_SET('1', areacode) > 0 
+0

私は本当にあなたの華麗な答えに感謝します。ただし、INとFIND_IN_SETを一緒に使用する方法はありませんか?私はSQLステートメントの小さな知識が残念 –

+0

か、私はちょうどどこfind_in_setまたはIN()を使用するか? –

+0

'FIND_IN_SET()'チェックを追加することができます。私は私の答えを更新します。 –

関連する問題