MYSQLでのSELECT文の条件指定方法に関して教えてください。


仮にテーブルの一つのカラムに「111,121」というデータが入っているとします。

SELECT hoge from hoge_table where hoge LIKE '%11%';

というSQLを指定すると、本来は11は含まれていませんので、結果は返らないのですが、111が該当してしまい、本来の意図とは異なる結果が返ってしまいます。

このような時はどのようなSQL文を書けば良いのでしょうか。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/08 20:20:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:HALSPECIAL No.7

回答回数407ベストアンサー獲得回数86

ポイント17pt

データの格納方法を変えればいいのではないでしょうか?


スペース区切りで、両端にもスペースを入れるとか、

_11_111_123_
ここで、_ はスペースの意味

カンマ区切りで、両端にもカンマを入れるとか、

,11,111,123,

すれば、

SELECT hoge from hoge_table where hoge LIKE '%,11,%';

id:tomohirof

これは目から鱗!ありがとうございます!

2010/02/02 18:30:53

その他の回答6件)

id:e55ind No.1

回答回数162ベストアンサー獲得回数4

ポイント18pt

SELECT hoge from hoge_table where hoge LIKE '%11%' and NOT LIKE '%111%'

id:tomohirof

ありがとうございます。質問の仕方が悪かったようです。。。すいません。

2010/02/02 08:15:08
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント17pt

質問からすると 以下のようにすれば 思ったものが検索できると思われます。

SELECT hoge from hoge_table where (hoge LIKE '11,%') or (hoge LIKE '%,11,%') or (hoge LIKE '%,11');

id:tomohirof

ありがとうございます!確かにそうですね。

2010/02/02 08:15:10
id:HALSPECIAL No.3

回答回数407ベストアンサー獲得回数86

ポイント17pt

どのような結果が得たいのか、

いまいち理解できないので、ピンポイントで答えられないのですが、

正規表現を使えば可能かと思います。

http://dev.mysql.com/doc/refman/5.1/ja/regexp.html


Chocotte de Choo

MySQLでも正規表現

id:tomohirof

ありがとうございます。正規表現で解決してみます。

私の質問の仕方が悪かったかもしれません。。

何でも構わないのですが、例えば、旅行の行き先として、希望の都道府県を入力するページがあったとします。

「東京、大阪」という人もいますし、「沖縄と神奈川」という人もいるとします。それぞれの都道府県が、仮に1から連番で値を持っていたとすると、ある人のカラムには「1,11」、ある人には「31,33」といった形でデータが入力されることになります。

この際に、1のデータを持っている人だけを検索するには、どういうSQLを書けばいいのだろうというのが疑問であり、質問です。

ちょっと、質問の仕方が悪かったですね。反省します。

2010/02/02 08:21:17
id:chuken_kenkou No.4

回答回数722ベストアンサー獲得回数54

ポイント17pt

一つのカラムに「111,121」というデータが入っている

どういう意味を持つデータでしょうか?


where hoge LIKE '%11%';

というSQLを指定すると、本来は11は含まれていませんので、結果は返らないのですが、111が該当してしまい

一般的なSQL本来の動作です。

LIKE条件の使い方、データ型について、もう少し勉強しましょう。

id:tomohirof

ありがとうございます!もう少し勉強してみるとともに、しっかりと整理して再質問してみます。

2010/02/02 08:22:17
id:t-wata No.5

回答回数82ベストアンサー獲得回数13

ポイント17pt

仮にテーブルの一つのカラムに「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を使っての検索だと、レコード数に比例して検索が遅くなります。

id:tomohirof

やはり!Tableをわけるべきではないかと思っていたんです。。。

ありがとうございます!

2010/02/02 15:00:29
id:heke2mee No.6

回答回数162ベストアンサー獲得回数43

ポイント17pt

MySQL使ったこと無いので外してたらすみません。


インデックスがいくつから始まるか

分からないので数字は適当です。


文字列切り出し substring() 関数

文字列検索 locate() 関数

を組み合わせて、こんな感じかな?


WHERE

SUBSTRING(hoge, 1, LOCATE(',', hoge )) = '11' OR

SUBSTRING(hoge, LOCATE(',', hoge ) +1 ) = '11'

カンマが複数あるならLOCATEの引数を変えればいけると思います。

id:tomohirof

なるほど、こういう解決策もあるんですね。

ありがとうございます!

2010/02/02 15:01:29
id:HALSPECIAL No.7

回答回数407ベストアンサー獲得回数86ここでベストアンサー

ポイント17pt

データの格納方法を変えればいいのではないでしょうか?


スペース区切りで、両端にもスペースを入れるとか、

_11_111_123_
ここで、_ はスペースの意味

カンマ区切りで、両端にもカンマを入れるとか、

,11,111,123,

すれば、

SELECT hoge from hoge_table where hoge LIKE '%,11,%';

id:tomohirof

これは目から鱗!ありがとうございます!

2010/02/02 18:30:53

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません