MySQL/PHP IN文の使い方と問題解決方法

このQ&Aのポイント
  • MySQL/PHPのIN文は、特定の値がリスト内に含まれているかどうかを判定するための便利な方法です。
  • 通常はリスト内の値を指定してSELECT文を作成しますが、逆に特定の値がリスト内に含まれているかをチェックすることもできます。
  • PHPやSQLを使用して、column1の値がリスト内に含まれているかどうかを判定する方法を学びましょう。
回答を見る
  • ベストアンサー

MySQL/PHP IN文

SQLのIN文の用途に関する質問です。 普段は SELECT columns FROM tables WHERE column1 in (value1, value2, .... value_n); のように使いますが、 WHERE value1 in column1; のようにすればできないのでしょうか? column1の値は 1,4,7,3というような内容になっています。 その中にvalue1が含まれているかどうかを判定したい場合はどうすればいいのでしょうか? PHPかSQLでこのような問題を解決する方法をおわかりの方がいらっしゃいましたら、教えていただけないでしょうか? よろしくお願いします。

  • 2B2B
  • お礼率100% (60/60)
  • MySQL
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

こういうことでしょうかねぇ? create table tableA(id int,columns varchar(100)); insert into tableA values(1,'1,4,7,3'),(2,'5,3,22'),(3,'1,2,3'),(4,'2,3,1'),(5,'1'),(6,'4,4,4'); ※id=2は22はあっても2は含まれない、id=3や4はid=1の順番違い id=5のように単一データや、id=6のような同じデータを複数もつ場合も想定 「1」を対象とする SELECT id FROM tableA WHERE columns REGEXP '(^|,)1(,|$)' id=1,3,4,5がヒットします 「2」を対象とする SELECT id FROM tableA WHERE columns REGEXP '(^|,)2(,|$)'; id=3,4がヒットします(22はヒットしません) 「3」か「4」を対象とする SELECT id FROM tableA WHERE columns REGEXP '(^|,)(3|4)(,|$)'; ・・・とここまで書いて言うのもなんですが カンマ区切りでデータを持つのはSQL的には最悪です。 きちんとデータ分けて処理することをお勧めします。

2B2B
質問者

お礼

ありがとうございます!おかげ解決できました。

その他の回答 (1)

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.1

こういうことでしょうか? --- SELECT * FROM tables WHERE INSTR(column1 ,value1) > 0;

2B2B
質問者

お礼

ありがとうございます。 仰った方法では たとえばcolumn1の内容が 5,3,22 であれば value1が2でしたら、含まれていると判定してしまうのではないでしょうか? column1 が 5,3,22 であれば、 5か3か22が正解で、ほかの値を拒否するようにしたいのですが、これをどうすれば実装できるのでしょうか? 御手数ですが、またよろしくお願いします。

関連するQ&A

  • SQL文でWhere+orを使う理由

    ItemsテーブルからValueにAという値かBという値を持ってる人のNameを取得するSQL文について調べたのですが、以下のようになってました。 SELECT Name FROM Items WHERE Value IN ('A', 'B') これで動く結果については納得できたのですが、ORを使っても良いのではないでしょうか。以下のようなやり方は出来ないのかと思ったのですが SELECT Name FROM Items WHERE Value = 'A' or 'B' のように=(イコール)の後の値にorをつけるという書き方は見当たりませんでした。これで動かない場合、以下の方法なら動くはずだと思います。 SELECT Name FROM Items WHERE Value = 'A' or Value = 'B' おそらく結果はINを使った場合と同じだと思うのですが、これはどのようにして使い分けられているのでしょうか?文の短さで言えば値が複数の場合はINの方がはるかに短くなってスマートですが、単数でもINの方が短く済みそうな気がします。INの後のカッコ内に更にSQL文を書くことも出来ますし、Where+orの意義がよく分からなくなってきました。

  • IN句に副問合わせを使う場合と使わない場合

    お世話になります。 SQLについての質問です。 RDBMSはSymfowareです。 IN句に副問い合わせを指定するSQLと その副問い合わせの結果を直接IN句に記載したSQLで 結果が異なってしまいます。 こういうことってありますでしょうか。 以下のようなSQLです。 (1) SELECT * FROM T1 WHERE T1.column_A IN ( SELECT T2.column_A FROM T2 WHERE T2.column_B='XXXX' ) 上記IN句内のSELECT文の結果は、'A'、'B'、'C'、'D'です。 (2) SELECT * FROM T1 WHERE T1.column_A IN ('A','B','C','D') この(1)、(2)のSQLの結果が異なってしまいます。 私の環境では(1)では0件、(2)では2件ヒットします。 なぜこのようになるのかわかる方がいらっしゃいましたら ご教授ください。 ちなみに、DBを操作して、副問い合わせのSELECT文の結果を 'A'、'B'とすると同じ結果が得られます。 副問い合わせのSELECT文の結果が3件以上になると(1)のSQLの 結果は0件になってしまいます。 RDBMSの障害でしょうか・・・? それとも、IN句に副問い合わせを使用する場合、 その副問い合わせの結果は2件以下にする必要がある なんてルールがあったりするのでしょうか。

  • PHP+MySQL

    PHP4で、MySQLに接続しています。 $connには、接続IDが格納されています。 以下のスクリプトで、「エラー」が出てしまうのですが、何故でしょうか? $sql = "SELECT (User_num, User_name, User_pass) FROM User WHERE User_name='$login_name'"; if (!$result= mysql_query($sql, $conn)){ die (print ("エラー")); } SQL文を、 SELECT (User_num) FROM User WHERE User_name='$login_name' と書き換えるとうまくいきます。複数にするとエラーというのはどうしてでしょう

    • ベストアンサー
    • MySQL
  • UPDATE文の副問い合わせ

    こんばんわ。 今少し書き方がわからないSQL文があって困っています。 テーブルA(データが入ってるテーブル)に 新規でカラムを追加したので、 今UPDATE文を使いたいと思っています。 膨大なので、1つ1つする訳にはいかないので、 条件指定して、あるカラムにあるとある条件に合致するものは 新規カラムの値が4とか ある条件なら、新規カラムの値が6などと入れたい感じです。 自分なりに調べて UPDATE テーブル名 SET 新規カラム = 値 WHERE (SELECT * FROM 同じテーブル名 WHERE 条件) だと思って色々書いたり試行錯誤したのですが、 全然できませn。 どのように書けばよろしいのでしょうか? またUPDATEをかける際の条件指定に2つの違った 条件(同じカラムの違う条件、または別カラムの条件) を入れることは可能でしょうか? 回答いただけるとありがたいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLで戻り値が重複している

    PHPとMySQLを使っています。 下のようなSQL文を作成し、値を引き出そうとしています。 <SQL文> SELECT * FROM table_name WHERE A = "あ" AND B='い' <DBに登録済みの取り出したいデータ> あ、い、う、え、お ところが、戻ってくる値が、 あ、あ、い、い、う、う、え、え、お、お のように、値が重複して戻ってきます。 いろいろ調べましたが、原因がさっぱりわかりません。 ご存知の方、教えていただけると助かります。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • MYSQLで全てのカラムから検索する。

    tbというテーブルのbangというカラムに4が含まれていれば表示というのは select * from tb where (bang) like '%4%' ; という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。 select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ; と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。 もう少しスマートにする方法はありませんか?

    • ベストアンサー
    • MySQL
  • SQL文について質問させて頂きます。

    いつもお世話になっております。いろいろSQL文の本を読んだのですがわからないので今回もよろしく お願い致します。 SELECT DISTINCT * FROM bukken WHERE (id IN (SELECT fid FROM fudou_kodawari WHERE kid IN (1,4))) というSQL文があるのですが、これだと1,4が1つでも含まれるリストが出てくるのですが1,4が完全に一致しないと出てこないようにするにはどのようにSQL文を変更すれば良いのでしょうか? 何卒よろしくお願い致します。

  • version7,version8 の型の扱い

    PostgreSQL の 7 から8 へマイグレーション作業をしている者です。 int型で not null制約のあるカラム「id」 の値から、''(空)であることを判定する時、 version7 では、 $sql = "select * from tbl_name where id <> ''"; のSQL文で動いていたようですが、 version8 では、 型の扱いが厳しくなった訳か、syntax error となります。 この場合version8 では、 $sql = "select * from tbl_name where id <> 0"; が、 ''(空)であることを判定するSQL文と考えてよいでしょうか? ご教授よろしくお願いします。

  • PHPとMYSQLで検索

    PHPとMYSQLで select * from artist WHERE artist LIKE 'aki' AND artist_yomi LIKE 'アキ' とSQL文があり、 ヒットした場合は、 ヒットしました。 ヒットしなかった場合は、 ヒットしませんでした。 と表示させたいです。

    • ベストアンサー
    • PHP
  • Oracle SQLの、where句内の条件文について教えてください。

    Oracle SQLの、where句内の条件文について教えてください。 下記SQLの(1)と(2)の記述文を教えてください。 (1)例:owner = sys,admin ownerがsysまたは、adminを抽出 (2)例:column_name = '*aaa*' column_nameに「aaa」が含まれているデータ SELECT owner, table_name,column_name FROM all_tab_columns WHERE (1)(Ownerを複数指定)   and (2)(column_nameに、●●が含まれるデータ)