仮にテーブルの一つのカラムに「111,121」というデータが入っているとします。
SELECT hoge from hoge_table where hoge LIKE '%11%';
というSQLを指定すると、本来は11は含まれていませんので、結果は返らないのですが、111が該当してしまい、本来の意図とは異なる結果が返ってしまいます。
このような時はどのようなSQL文を書けば良いのでしょうか。
データの格納方法を変えればいいのではないでしょうか?
スペース区切りで、両端にもスペースを入れるとか、
_11_111_123_ ここで、_ はスペースの意味
カンマ区切りで、両端にもカンマを入れるとか、
,11,111,123,
すれば、
SELECT hoge from hoge_table where hoge LIKE '%,11,%';
SELECT hoge from hoge_table where hoge LIKE '%11%' and NOT LIKE '%111%'
ありがとうございます。質問の仕方が悪かったようです。。。すいません。
質問からすると 以下のようにすれば 思ったものが検索できると思われます。
SELECT hoge from hoge_table where (hoge LIKE '11,%') or (hoge LIKE '%,11,%') or (hoge LIKE '%,11');
ありがとうございます!確かにそうですね。
どのような結果が得たいのか、
いまいち理解できないので、ピンポイントで答えられないのですが、
正規表現を使えば可能かと思います。
http://dev.mysql.com/doc/refman/5.1/ja/regexp.html
Chocotte de Choo
ありがとうございます。正規表現で解決してみます。
私の質問の仕方が悪かったかもしれません。。
何でも構わないのですが、例えば、旅行の行き先として、希望の都道府県を入力するページがあったとします。
「東京、大阪」という人もいますし、「沖縄と神奈川」という人もいるとします。それぞれの都道府県が、仮に1から連番で値を持っていたとすると、ある人のカラムには「1,11」、ある人には「31,33」といった形でデータが入力されることになります。
この際に、1のデータを持っている人だけを検索するには、どういうSQLを書けばいいのだろうというのが疑問であり、質問です。
ちょっと、質問の仕方が悪かったですね。反省します。
一つのカラムに「111,121」というデータが入っている
どういう意味を持つデータでしょうか?
where hoge LIKE '%11%';
というSQLを指定すると、本来は11は含まれていませんので、結果は返らないのですが、111が該当してしまい
一般的なSQL本来の動作です。
LIKE条件の使い方、データ型について、もう少し勉強しましょう。
ありがとうございます!もう少し勉強してみるとともに、しっかりと整理して再質問してみます。
仮にテーブルの一つのカラムに「111,121」というデータが入っているとします。
テーブルを分割しましょう。
テーブル1
ID | Value | Other ... |
---|---|---|
1 | 10,11,12 | .... |
2 | 111,121 | .... |
のようなテーブルは、
テーブル1
ID | Other |
---|---|
1 | .... |
2 | .... |
テーブル2
Table1_ID | Value |
---|---|
1 | 10 |
1 | 11 |
1 | 12 |
2 | 111 |
2 | 121 |
のように分割するべきです。この場合、2つのテーブルを結合することで、今と等価なデータが得られます。
また、テーブル2のTable1_IDとValueにindexを作成すれば、レコードがいくら増えても、
「valueが11」のような検索はほとんど変わらない性能で検索できます。
一方いまのままLikeを使っての検索だと、レコード数に比例して検索が遅くなります。
やはり!Tableをわけるべきではないかと思っていたんです。。。
ありがとうございます!
MySQL使ったこと無いので外してたらすみません。
インデックスがいくつから始まるか
分からないので数字は適当です。
文字列切り出し substring() 関数
文字列検索 locate() 関数
を組み合わせて、こんな感じかな?
WHERE
SUBSTRING(hoge, 1, LOCATE(',', hoge )) = '11' OR
SUBSTRING(hoge, LOCATE(',', hoge ) +1 ) = '11'
カンマが複数あるならLOCATEの引数を変えればいけると思います。
なるほど、こういう解決策もあるんですね。
ありがとうございます!
データの格納方法を変えればいいのではないでしょうか?
スペース区切りで、両端にもスペースを入れるとか、
_11_111_123_ ここで、_ はスペースの意味
カンマ区切りで、両端にもカンマを入れるとか、
,11,111,123,
すれば、
SELECT hoge from hoge_table where hoge LIKE '%,11,%';
これは目から鱗!ありがとうございます!
これは目から鱗!ありがとうございます!