MySQLでLIKE検索の値にフィールドの値をセットすると結果0になってしまう - PHPプロ!Q&A掲示板

2473

  • 0P

MySQLでLIKE検索の値にフィールドの値をセットすると結果0になってしまう

質問日時 / 2010年1月22日 13:00 (最終編集:1月22日 13:11)    回答数 / 4件

Questioner:  minak83  このエントリーをはてなブックマークに追加 

キーワード / MySQL    LIKE    SELECT   

PHP初心者です。

LIKE の 値の部分に
 1.table2.port をセットすると結果は0件になってしまいます。
 2.直接値(例えば%10%)を書けば結果は正しく得られます。
 3. 変数$dataをセットをすると結果は正しく得られます。

フィールド値をセットすることはできないのでしょうか?

SELECT * FROM table1 INNER JOIN tabel2 (省略) WHERE table1.id=$test AND (table1.msg like '%Port:str_pad(table2.port ,2," ",STR_PAD_LEFT)%' OR table1.msg like '%/tabel2.port$')";

よろしくお願い致します。


ツリー一覧

┗A01Kanonbell$dataってなんだろ? SQLのlike検索には、普通カラ
 ┗A01-1minak83回答ありがとうございます。 うーん、カラムは使えな
  ┗A01-1-1Kanonbell>$dataには数値が入ります。 いや、SQL文に$dataが見
   ┗A01-1-1-1minak83INSTRの説明ありがとうございます。 早速試してみま

回答一覧

並び替え:

A01 満足
answererKanonbell [1月23日 17:32]

$dataってなんだろ?

SQLのlike検索には、普通カラムは使えません。
  1. ColumnName like pattern
って感じの書式になっていて、「pattern」に使えるのはパターン文字列です。
これはMySQLに限らず、ほぼすべてのRDBMSで同じなんじゃないでしょうか。

なので
  1. table1.msg like '%/tabel2.port$'
ってのはカラム名ではなく単なる文字列として評価されていると思います。
※MySQLってパターン文字列にスラッシュとか$とか使えるんでしょうか?
※メタ文字じゃない単なる文字列としてなら動作するでしょうけれど。

また、この部分が気になりました。

  1. table1.msg like '%Port:str_pad(table2.port ,2," ",STR_PAD_LEFT)%'

どうもtable2.portカラムから2文字抜き出したもので部分一致したいように見えるんですが、もしそうなら意図通りには動かないんじゃ?
「Port:str_pad(table2.port ,2," ",STR_PAD_LEFT)」の部分がそのままただの文字列として評価されるか、PHPの関数部分が正常に動作すれば以下のようなSQLになるんじゃないでしょうか?

  1. table1.msg like '%Port:ta%'

最終的にどのようなSQL文になっているのか、echo文などで出力してみて確認した方が良いですよ。


他のカラムの中身が、別のカラムの中身を含むかどうかを調べたいときには、MySQLの場合INSTRとか使うことになるでしょうか。
まーもうPHPじゃなくてMySQLの話題になってしまいますが。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerminak83 [1月23日 21:24]

回答ありがとうございます。
うーん、カラムは使えないのですか。大変参考になりましたありがとうございます。
$dataには数値が入ります。ある文字列の中からある部分の2文字が一致するかどうかチェックしています。
/ スラッシュは使えます。

str_pad」は私も気になっていて、試しにstr_padを使わないで実行してみましたがNGでした。
このときの最終的なSQL文は確認済みです。

今は一旦、検索をかけてその結果でSQL文を再構築して再検索しています。

>他のカラムの中身が、別のカラムの中身を含むかどうかを調べたいときには、MySQLの場合INSTRとか使うことになるでしょうか。

恐れいりますがこの部分を具体的に教えていただけないでしょうか。お手数をおかけ致しますが宜しくお願いいたします。

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyerKanonbell [1月23日 22:16] (最終編集:1月23日 22:19)

>$dataには数値が入ります。
いや、SQL文に$dataが見当たらないんで。。

>「str_pad」は私も気になっていて、試しにstr_padを使わないで実行してみましたがNGでした。

いや、なにか勘違いしてませんか?
str_padはPHPの関数なので、MySQL側には関係ないですよ。
「table2.portカラムから2文字抜き出したもので部分一致」ってことをもしやりたいなら、MySQL側で実行可能な関数で記述しないと。
私の方が勘違いしているのならいいんですが。

INSTRはこんなところを。
http://dev.mysql.com/doc/refman/4.1/ja/string-functions.html
バージョン分からないのでMySQL4.1のリファレンスですけれど。
よく考えてみたら、この関数で引数にカラムが使えるのかどうか確認してませんでした。
もしかしたらこれ使ってもダメかも。

こういった関数はベンダ依存がやや大きめなので、MySQL関連のところで質問した方が良いと思います。
カラムでlike検索したいけどできない、どうすれば?的質問で。


なんか昔この手の問題をやった記憶があるんですが、どうやったんだったかなあ。。
ベンダ依存の関数とか使わなくてもいけたような気がするんですが。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerminak83 [1月24日 13:50]

INSTRの説明ありがとうございます。
早速試してみましたが引数にカラムは使えないようです。

確かにMySQL関連の質問ですね。そちらをあたってみます。
大変お世話になりました。ありがとうございます。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)