MySQLの初心者です。よろしくお願いします。
1つのテーブルにある2つのフィールドのうち、どちらかにキーワードが入っている場合(両方に入っている場合も含む)を抽出したいのですが、検索するキーワードが1個の場合は、下記のようにすれば、うまく動くのですが、
●1個のキーワードで検索する場合
(例として、2つのフィールドのうちどちらかに「山」のキーワードが入っている場合を抽出)
select * from table WHERE (item_name LIKE "%山%" or outline LIKE "%山%" )
●テーブルの内容(テーブル名:table)
item_name | outline
==========+=========
山がある + 山と川
----------+----------
山がある + 川と森
----------+---------
山がある + 谷と林
---------------------
質問したいことは、上記のテーブルから、item_nameとoutlineのフィールドのうち、2つのキーワード「山」と「川」が両方含まれるレコードを抽出したいです。上記のテーブルでいうと、抽出の結果、1行目と2行目が抽出したいのです。
ちなみに、下記のように記述したら、上記のテーブルで1行目だけ抽出されます。
select * from table WHERE (item_name LIKE "%山%" and item_name LIKE "%川%" or outline LIKE "%山%" and outline LIKE "%川%" )
他にも、下記のように試してみたのですが、うまく抽出できませんでした。
SELECT * FROM table WHERE (concat(item_name,outline) LIKE '%山%' and concat(item_name,outline) LIKE '%川%')
item_nameとoutlineのフィールドを結合して、結合した文字列で、「山」と「川」の両方が入っているレコードを抽出する方法はありますか?
2つのフィールドの文字列をあわせたなかから、「山」と「川」のキーワードが両方含まれるレコードを抽出したいのですが、何かよい方法はありますでしょうか。ご回答よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
まず第一に、'%山%'というような書き方は、インデックスがまっとうに
きかないので、高速化は期待できせん。
またCONCATしたものに対する検索もインデックスが利きません。
よって処理としてはできるけど、SQLらしくない処理だという前提で
ご理解ください。
あとサンプルとはいえテーブルにtableという名前をつけるのは
いただけません。混乱の元なので注意ください。そのうえで例示の・・・
SELECT * FROM yamakawa_table WHERE CONCAT(item_name,outline) LIKE '%山%' AND CONCAT(item_name,outline) LIKE '%川%'
ってやりましたが、特に問題なさそうですが・・・
これは条件が片方ならヒットするということですか?
バージョンによっては日本語検索の精度にバラつきがあるので
そのせいかもしれませんね
なお、ホントはだめなんですが、上記のSQLを以下のように書いても
同じ結果になるようです。
SELECT *,concat(item_name,outline) AS K FROM yamakawa_table HAVING (K LIKE '%山%' AND K LIKE '%川%')
(しつこいようですが、ホントはだめなんですよー)
効率は変わりませんが考え方としてはこんな感じでもいけそうです
SELECT * FROM yamakawa_table WHERE (item_name LIKE '%山%' OR outline LIKE '%山%')+(item_name LIKE '%川%' OR outline LIKE '%川%') >=2
この回答への補足
ご回答いただき、ありがとうございました。
テーブル名に関しまして、教えていただき、今後気をつけます。
バージョンによって、日本語検索の制度にバラつきとのことで、違うバージョンで試してみました。
利用しているレンタルサーバーが、2つのバージョンのMySQLを利用できる環境にありますので、MySQL 4.0.26でやってみたら、うまくいきませんでしたが、MySQL 5.0.51のほうで、同じようにやってみましたら、うまく検索できました。
ありがとうございました。
それから、CONCATを利用したものもインデックスがきかないとありましたが、同じ内容のものをSQLらしく書く方法がありましたら、ご回答いただければと思います。
よろしくお願いいたします。
No.3
- 回答日時:
>同じ内容のものをSQLらしく書く方法がありましたら
実は構造的にいじらないと無理なんですよ、ちょっとレベルが高い処理
になるので、いまはまだ時期尚早かもしれませんね
SQLで高速にLIKEがつかえるのは前方一致か後方一致のいずれか、
すなわちLIKE '山%'かLIKE '%山'のどちらかしか有効ではありません。
(遅くてもいいならご提示の方法でもいけます)
もしやるなら・・・kakasiなどで分かち書きをして全文検索するとか、
キーワードを別途専用にテーブルで管理するとかいろいろ手間がかかります。
いろいろと教えていただき、ありがとうございました。
感謝いたします。
まだまだ初心者なので、これからいろいろ勉強していきたいと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
limit offset はupdate文には使...
-
1つのSQLで2段階の抽出を行い...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
VBAでの行数を揃える方法
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
エラーを起こす方法
-
テーブル名が可変の場合のクエ...
-
ExcelのVLOOKUP関数の動作をMyS...
-
'modify' 付近に不適切な構文が...
-
オラクルのUPDATEで複数テーブル
-
selectの単純繰り返し
-
既存データをINSERT文にして出...
-
PostgreSQLのtimestamp型で時間...
-
SQLで、Join句で結合したテ...
-
ListBoxにAddItemする際、重複...
-
Excel 複数のセルが共に一致す...
-
エクスポート不具合
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
AccessVBAについて テーブルの...
-
1つのSQLで2段階の抽出を行い...
-
SQLで、過去で一番大きい日付の...
-
limit offset はupdate文には使...
-
複数の値を1レコードに表示した...
-
SQLでレコード間の値の交換
-
ACCESS サブフォームについて
-
SQLのinの使い方
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
-
テーブル名が可変の場合のクエ...
-
PostgreSQLのtimestamp型で時間...
-
UPDATEで既存のレコードに文字...
-
pandasでsqlite3にテーブル作成...
-
timestampのデータはどのように...
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
エラーを起こす方法
おすすめ情報