
頭の整理ができないので技術的なこともさることながら、SQL構築の考え方もうかがいたいのですが、
以下のテーブルに対して、スペース区切りで複数キーワードをAND条件で結ぶとして
ID MyCol1 MyCol2
--------------------------
1 いちご みかんジュース
2 ぶどう いちごみるく
3 みかん すいかジュース
4 すいか めろんソーダ
5 めろん ぶどうガム
検索フォームに「いちご ソーダ(※スペース区切り)」と入れたら、IDの1、2、4がマッチするようにしたいです。
スペース区切りで複数キーワードをAND条件で結ぶSQLは、以前教わりました。
http://oshiete.goo.ne.jp/qa/1212708.html
$sql = 'select * from t_url';
if ($title != '') {
$titles = array();
foreach (preg_split('/(\s| )+/', $title) as $word) {
array_push($titles, "MyCol1 like '%$word%'");
}
$sql .= ' where (' . implode(' and ', $titles) . ')';
}
今回の質問は、受け取った$titleを「MyCol1」だけでなく「MyCol1かMyCol2」にも同じ照会する方法をうかがいたいです。
検索キーワードが「いちご ソーダ」だったとき、MyCol1だけなら、
and (MyCol1 like '%いちご%' and MyCol2 like '%ソーダ%')
でよいわけですが、MyCol2はどう熱かったらいいのでしょうか。
and (MyCol1 or MyCol2 like '%いちご%' and MyCol1 or MyCol2 like '%ソーダ%')
みたいにできればよいのでしょうが。
PHPのコードも、上記のものだとMyCol1にしか照会がかかりませんが・・・
No.2ベストアンサー
- 回答日時:
and (concat(MyCol1,' ',MyCol2) like '%いちご%'
and concat(MyCol1,' ',MyCol2) like '%ソーダ%')
とでもすれば手っ取り早いと思いますが。
concat()・・・文字列をつなげます。
http://dev.mysql.com/doc/refman/5.1-olh/ja/strin …
具体的には、
ID Concat(MyCol1,' ',MyCol2)
--------------------------
1 いちご みかんジュース
2 ぶどう いちごみるく
3 みかん すいかジュース
4 すいか めろんソーダ
5 めろん ぶどうガム
となり、「いちご」と「ソーダ」をorでつなげば、1,2,4がでてきます。
(なお、andでつなぐと、質問にかかれた1,2,4でなく、1件もでてこないですが。)
なんで、,' ',をいれているかというと、
6 といち ごりら
とあると
Concat(MyCol1,MyCol2)
では、
6 といちごりら
となり、「いちご」が見つかってしまうためです。
Siegruneさん、非常にわかりやすくご回答いただき、大変参考になりました。
結果は完全に期待どおり、複数キーワードで複数カラムからの絞込みができるようになりました。
スペース区切りの複数キーワードについても、元質問を
array_push($titles, "concat(MyCol1,' ',MyCol2) like '%$word%'");
とすることでうまくいき、大変助かりました。
ありがとうございました。
No.1
- 回答日時:
> 検索フォームに「いちご ソーダ(※スペース区切り)」と入れたら、IDの1、2、4がマッチするようにしたいです。
これだとMyCol1にもMyCol2にも「ソーダ」が含まれていない行や、MyCol1にもMyCol2にも「いちご」が含まれていない行もヒットするので、AND検索ではなくOR検索になりそうですが?
それから考えて、「MyCol1 と MyCol2 のどちらかに『いちご』または『ソーダ』が含まれるもの」という条件だと仮定すると、下記の様に単純に全条件をORでつなげれば対応できるかと。
SELECT * FROM tmp_table WHERE
MyCol1 LIKE '%いちご%' OR
MyCol2 LIKE '%いちご%' OR
MyCol1 LIKE '%ソーダ%' OR
MyCol2 LIKE '%ソーダ%';
また、2カラムに対するAND検索というと、「MyCol1 と MyCol2 のどちらかに『いちご』が含まれ、かつ、MyCol1 と MyCol2 のどちらかに『ソーダ』が含まれる」の様な条件が考えられますが、こちらは下記の様なSQLになります。
SELECT * FROM tmp_table
WHERE
(MyCol1 LIKE '%いちご%' OR MyCol2 LIKE '%いちご%') AND
(MyCol1 LIKE '%ソーダ%' OR MyCol2 LIKE '%ソーダ%')
;
蛇足ですが、外部に公開するようなシステムの場合は、入力値をそのままSQLに入れるのは危険ですのでプレースホルダを使うなどの対策をした方が良いです。
http://www.atmarkit.co.jp/fsecurity/column/ueno/ …
root139さん、詳しくご教示いただき大変ありがとうございました。
おかげさまで考え方、非常によく整理できました。
後学のため、ご提示のものも一通り試して結果拝見しました。
>入力値をそのままSQLに入れるのは危険
こちらについてもご忠告大変ありがとうございました。
まずはローカルで「やりたい形」を実現して、仰せのセキュリティ対策も施していきたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- 物理学 問題の問2について質問なのですが、 明線条件、経路差Δ=2(L2-L1)=mλより 2(L2-L1) 5 2023/01/10 19:03
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
下記の問合せを行うクエリを、P...
-
mysqlがインストールされている...
-
下記の問合せを行うクエリを、P...
-
下記の問合せを行うクエリを、P...
-
テーブル名が可変の場合のクエ...
-
MySQL NULLだけをカウントして...
-
SQLで漢字名称を都道府県や市区...
-
エラー 1068 (42000): 複数の主...
-
何にかが違うから エラーなんで...
-
MySQLでcreateが使えない MySQL...
-
データベースの接続について
-
同一日に複数レコードがある場...
-
MAMP 99ドル約1.6万円 高い...
-
あってますか?SQL
-
WHERE `年月日` = '晴' OR `年...
-
SQLです教えてくださいお願いし...
-
SQLを作ったのですがうまくいき...
-
(初心者)MySQLやmaraDBで、crea...
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysqlがインストールされている...
-
同一日に複数レコードがある場...
-
#1062 - '0' は索引 'PRIMARY' ...
-
エラー 1068 (42000): 複数の主...
-
SQLでカラムを追加し、条件に合...
-
テーブル名が可変の場合のクエ...
-
【初歩】ラジオボタンをつかっ...
-
MySQLのテーブル作成でハイフン...
-
mysqlのupdate構文についての質...
-
LIMIT で条件を満たしているの...
-
データベースの接続に失敗して...
-
MySQL NULLだけをカウントして...
-
select *, `人口(男)`AND`人口(...
-
複数DBテーブルからのデータ取得
-
テーブル:生徒名簿 生徒名簿の...
-
htmlコードで書かれた表にphpで...
-
データベースの複製の仕方(mysql)
-
「重複を間引いた数」をcountし...
-
MAMP 99ドル約1.6万円 高い...
-
SQLです教えてくださいお願いし...
おすすめ情報