SELECT文での絞り込み方法についての質問

このQ&Aのポイント
  • こんにちは、SELECT文での絞り込み方法についてうまく行かないので質問させてください。
  • MST_USERとMST_USER_SETTINGという2つのテーブルからメールアドレスを取得したいと考えています。
  • やりたいことは、MST_USER_SETTINGから2年生の教師のUSER_IDを取得してMST_USERのMAILADDRESSを取得したいということです。しかし、WHERE句の指定がうまくいかず、正しく取得できません。
回答を見る
  • ベストアンサー

SELECT文での絞り込み

こんにちは、SELECT文での絞り込みでうまく行かないので質問させてください。 現在、以下の2つのテーブルがあります。 これらのテーブルからメールアドレスを取得したいと考えています。 1.MST_USER <KEY--> USER_ID MAILADDRESS -------+----------------- 1|hoge1@example.com 2|hoge2@example.com 3|hoge3@example.com 2.MST_USER_SETTING <KEY------------> USER_ID SELECT_ID OPTION_ID -------+---------+--------- 1|BUNRUI |KYOUSHI // 教師 1|GAKUNEN |2 // 2年生 2|BUNRUI |HOGOSYA // 保護者 2|GAKUNEN |2 // 2年生 3|BUNRUI |GAKUSEI // 学生 3|GAKUNEN |2 // 2年生 やりたい事は、 MST_USER_SETTINNGから2年生の教師のUSER_IDを取得して MST_USERのMAILADDRESSを取得したいという事です。 一応、以下のようにやってみたのですが、 SELECT "MST_USER"."MAILADDRESS" FROM "MST_USER" LEFT JOIN "MST_USER_SETTING" ON "MST_USER_SETTING"."USER_ID" = "MST_USER"."USER_ID" WHERE ("MST_USER_SETTING"."SELECT_ID" = "BUNRUI" AND "MST_USER_SETTING"."OPTION_ID" = "KYOUSHI") AND ("MST_USER_SETTING"."SELECT_ID" = "GAKUNEN" AND "MST_USER_SETTING"."OPTION_ID" = "2") ) WHERE句の指定が悪いせいか、正しく取得できませんでした。 以上、よろしくお願い致します。

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

  • ベストアンサー
  • ww-_-ww
  • ベストアンサー率51% (46/89)
回答No.3

再度登場です^^; それでしたら「SELECT_ID」フィールドに教師、保護者、学生などを、「OPTION_ID」に学年を定義すれば良いのでは?

oops1967
質問者

補足

ww-_-wwさま。 ご回答ありがとうございます。 >それでしたら「SELECT_ID」フィールドに教師、保護者、学生などを、「OPTION_ID」に学年を定義すれば良いのでは? 申し訳ございません、私の読解力がないせいかもしれませんが、そのようにすると、汎用性が無くなるのではないか?と思います。 (多分、SELECT_ID=教師、OPTION_ID=2 と言うふうに・・・と言うアドバイスだと思いながら、書いています。) 仲間に相談したところ、今回のSQL文では SELECT A.USER_ID, A.MAILADDRESS FROM MST_USER A, (SELECT * FROM MST_USER_SETTING WHERE SELECT_ID = 'BUNRUI' AND OPTION_ID = 'KYOUSHI' ) B, (SELECT * FROM MST_USER_SETTING WHERE SELECT_ID = 'GAKUNEN' AND OPTION_ID = '2' ) C WHERE A.USER_ID = B.USER_ID AND B.USER_ID = C.USER_ID と言うように記述し、JOINする部分はSELECT_ID単位にコードで吐かせるようにすれば? とアドバイスを受けました。 確かにSELECT_IDに設定される内容が可変なので、これならうまく行く、と考えています。 そもそも、やりたい事は単純だけど無理がある、もしかしてテーブル設計ミス?とも考えていますが、やはり、これ以外に思いつかないのが現状です。

その他の回答 (3)

  • ww-_-ww
  • ベストアンサー率51% (46/89)
回答No.4

再三すいません。 「汎用性」というのがどこまでのものなのか把握でききれずに回答していました。 「汎用性」という意味はかなり抽象的ですから。 先ほど記載されたSQL文であれば確かにご希望の値が取得できるかと思います。 こちらこそ、まともなアドバイスが出来ていないようで申し訳ありませんでした。

oops1967
質問者

お礼

ww-_-wwさま ご回答ありがとうございます。 >「汎用性」という意味はかなり抽象的ですから。 ご指摘の件、申し訳ないと思います。 また、おっしゃる通りだとも思います。 まともなアドバイスが出来なかったとの事ですが、そのような事はありません。 テーブル設計について再考できましたし、貴重なアドバイスだったと感謝しています。 今後ともよろしくお願い致します。

  • ww-_-ww
  • ベストアンサー率51% (46/89)
回答No.2

こんにちわ。 テーブル2としては以下のように持てばいいのでは? USER_ID  GAKUNEN   MEMBER --------+------------+------- 1     │1        │KYOUSHI 2     │1        │HOGOSHA 3     │1        │GAKUSEI 4     │2        │KYOUSHI 5     │2        │HOGOSHA 6     │2        │GAKUSEI 仕様をすべて把握していないので、この程度でしかいえなくて申し訳ない。

oops1967
質問者

補足

ww-_-wwさま。 ご回答ありがとうございます。 申し訳けございません、テーブル2なのですがフィールドを固定にする事は出来ないのです。 テーブルは自由に定義できますが、飽くまでも汎用性を持たせなければならないのです。 ちなみに何をやっているかというと・・・ 1.管理者が管理する項目を決める(SELECT_ID) 2.利用者が自分に当てはまる内容を設定する(OPTION_ID) 3.管理者は条件(SELECT_ID/OPTION_ID)を指定して該当する利用者を抽出する 上のような事です。 管理する項目としては 1.学校を想定した場合  学年、分類(学生/保護者/教師)、etc... 2.飲食店を想定した場合  性別、誕生月、etc... と言うように、可変なのです。

  • ww-_-ww
  • ベストアンサー率51% (46/89)
回答No.1

こんにちわ。 個人的には2のテーブル設計を見直したほうが良いかと思います。 あまりにも設計が悪く見えます。

oops1967
質問者

補足

ww-_-wwさま。 ご回答ありがとうございます。 >個人的には2のテーブル設計を見直したほうが良いかと思います。 >あまりにも設計が悪く見えます。 確かにおっしゃる通りだと思います。 でも、これ以上のことが他に思いつかなかったのです。 2のテーブル設計、どうすれば良いのか・・・? 正直、悩んでいます。 要件は、「ユーザの付帯情報を可変に出来る事」だったので、 このようにしたのですが、、、 この件を含め、良い案があれば、何卒よろしくお願い致します。

関連するQ&A

  • SELECT出来るのにDELETE出来ないのはなぜ

    MySQLで下記SELECTレコードを削除したいと思い、 DELETEへ変えたら文法エラーになります。 SELECT * FROM `piyo` AS a LEFT JOIN `hoge` AS c ON a.`hoge_id` = c.`hoge_id` WHERE c.`x_id` =13 DELETE * FROM `piyo` AS a LEFT JOIN `hoge` AS c ON a.`hoge_id` = c.`hoge_id` WHERE c.`x_id` =13 どう書けば良いでしょうか?

    • ベストアンサー
    • MySQL
  • SELECT クエリーの OR の使い方を教えてください。

    SELECT クエリーの OR の使い方を教えてください。 複数テーブルから条件に合ったものを取り出したいのですがうまくいきません。 クエリは下記のように書いています。 $query = "SELECT pa.options_values_id, pa.options_id, pov.hc_options_values_id      FROM products_attributes pa, products_options_values pov      WHERE pa.products_id = '" . $key . "'      AND pa.options_id = '1'      AND (pa.options_id = '2' OR pa.options_id = '4')      AND pov.products_options_values_id = pa.options_values_id"; 希望としては、products_id が $key のものは複数あるのでその中の・・・ options_id が '1'は必ずあるので取得 options_id が '2' か options_id が '4' のものはどちらかが、必ずあるのである方を取得 その中の products_options_values_id が options_values_id のものを最終的に取得したいのですが・・・ クエリーを2個に分けて・・・ $query = "SELECT pa.options_values_id, pa.options_id, pov.hc_options_values_id FROM products_attributes pa, products_options_values pov WHERE pa.products_id = '" . $key . "' AND pa.options_id = '1' AND pov.products_options_values_id = pa.options_values_id"; $query = "SELECT pa.options_values_id, pa.options_id, pov.hc_options_values_id FROM products_attributes pa, products_options_values pov WHERE pa.products_id = '" . $key . "' AND (pa.options_id = '2' OR pa.options_id = '4') AND pov.products_options_values_id = pa.options_values_id"; のようにすると、うまくいったのですが出来ればまとめたいのでよろしくお願いします。

    • ベストアンサー
    • MySQL
  • Select文1 マイナス Select文2

    テーブルA ユーザーID,地名,県名,評価 テーブルB ユーザーID,県名,制覇flag のような二つのテーブルがあると仮定してSelect文1、 "select 県名,count(地名) from テーブルA where ユーザーID=1 group by 県名 order by count(地名);" の結果が 県名,count(地名) 北海道,30 東京,22 京都,15 名古屋,10 鳥取,9 沖縄,8 であるとし、 Select文2、 "select 県名 from テーブルB where usrid=1 and 制覇flag='true'" の結果が、 県名 北海道 東京 とします。 このSelect文1の結果から、Select文2の結果を引いて 県名,count(地名) 京都,15 名古屋,10 鳥取,9 沖縄,8 の結果を得るにはどうすればよいでしょうか? Mysqlのバージョンは5.0.21です。

    • ベストアンサー
    • MySQL
  • SELECTでgroup byした時の挙動

    環境は PHP5.3.3 MySQL5.0.95 です。 現在TBL1にURL(address)と、そのURLのタイトルタグの中身(title)と、独自に数えてる数字(count)を入れています。 その1つのアドレスに対してcountの数は色々あるので、 そのcountをアドレスと対にして合計したもの(SUM)で並び替えています。 (分かりづらかったらすいません。addressは主キーではないということです。) タイトルに関しては最近取得し始めたところで入ってるところと入っていないところがあります。 その状況下で SELECT address, title, sum(count) as SUM FROM TBL1 where address LIKE "%hoge.com%" group by address order by sum DESC LIMIT 10; こういうSQL文を使ってSELECTした際に、 hoge.com以下の例えばhoge.com/1.html, hoge.com/2.html, ... といった感じのURLごとにSUMの数で並び変わるのですが この場合titleはどのカラムを参照していることになるのですか? (address) (title) (SUM) hoge.com/1.html | test1 | 500 | hoge.com/2.html | test2 | 400 | hoge.com/3.html |    | 300 | hoge.com/4.html | test4 | 200 | hoge.com/5.html | test5 | 100 | hoge.com/6.html |    | 40 | hoge.com/7.html | test7 | 20 | hoge.com/8.html |    | 10 | hoge.com/9.html |    | 6 | hoge.com/10.html |    | 5 | こんな結果だったとして、titleが入っているものと入っていないものの区別がつきません。 入っていないURL(例えばhoge.com/3.html)のaddressカラムも全て空というわけではありません。 逆に入っているものに関しては、全ての行にtitleが入っているわけではありません。 主キーは今回のSELECTとは関係してない"ID"です。 ID | address | count | title 1 | hoge.com/1.html | 3 | test1 2 | hoge.com/1.html | 10 | 3 | hoge.com/1.html | 43 | test1 ID | address | count | title 1 | hoge.com/3.html | 4 | test3 2 | hoge.com/3.html | 3 | 3 | hoge.com/3.html | 42 | それぞれは主キーに応じてcountが個別にある状態です。 上記は正確ではありませんが、こんな感じです。 こうして共に入ったり入ってなかったりするのにSELECTした結果に 入ってるものと入ってないものが出てくるのが分かりません。 ちなみに、検証すると一番countが多い行にtitleが入っていたらSELECT文にも出てくるというわけではないようです。 なぜtitleが出るものと出ないものがあるのでしょう? ご教授宜しく御願い致します。

    • ベストアンサー
    • MySQL
  • select句副問い合わせ 値の個数が多すぎます

    SQL初心者です。 ORACLEで、SELECT句に副問い合わせを付けたところ、ORA-00913:値の個数が多すぎますとエラーになってしまいます。 解決法をご教授願います。 同一テーブルの同一項目を複数項目として取得したいのです。 SELECT (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.CCC), (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.FFF) FROM C_MST CMST WHERE CMST.A_RYAKU = '123'

  • 副問合せをするとエラーになってしまいます

    お世話になります PHP+MySQLにて開発しています あるテーブル1とテーブル2を使って テーブル1のデータを列挙したいのですが うまく行かずエラーが出てしまいます 構造は以下のようになっています ----------------- テーブル1 ----------------- ID  DATE  MEMO 0   3/24   aaa 2   3/25   ccc ----------------- テーブル2 ----------------- ID   BUNRUI 0   A 1   B 2   A テーブル2のBUNRUIが'A'の行のID(上で言うと0と2)を テーブル1のID検索条件にして、 かつDATEが'3/24'の行を取得したく思っています 書いたSQL文は SELECT * FROM テーブル1 WHERE date='3/24' AND id IN(SELECT id FROM テーブル2 WHERE bunrui='A') です。 結果としてテーブル1のID=0 DATE=3/24 MEMO=aaa が取れると良いのですが... 「SELECT id FROM テーブル2 WHERE bunrui='」 が不正とエラーが出てしまいます (判り難い説明で申し訳無いです…) 宜しくお願いします

    • ベストアンサー
    • MySQL
  • SELECT文でMySQLから取得したデータの使用

    PHP初心者なのでお手間を取らせてしまい申し訳ありませんがご教授お願いします。 select~ でMysqlより取得したデータをそのままMysqlで検索掛けたいので 下記のようにしてみたのですが機能しません "select * from address where addr_id like $row[addr]"; 多分色々と間違えてるのかも知れませんがよろしくお願いいたします。

  • LEFT JOINが2つあるSQL文でANDの意味

    ■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a  LEFT JOIN being b ON a.hoge_id = b.id  LEFT JOIN call c ON c.call_id = a.hoge_id   AND f.hoge_id = 12  WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

    • ベストアンサー
    • MySQL
  • EXPLAINのtypeがALLのときの対応方法

    先日問い合わせたSQLの高速化についてEXPLAINについて教えて頂きました。 そのEXPLAINについて調べながら試していくと、同じphpファイル内で動かしている いくつかのSQL文に対してEXPLAINのtypeがALLとなっていたので対応すべき SQLだとは分かったのですが具体的にどのようなSQL文に書き換えればいいか 分からなかったので再度質問しました。 前提としてWORDPRESSでSQLをPHPファイル内で$wpdb->get_results関数を使って 実行しています。 (例1) 条件一致した件数を求めるSQL SELECT a_mst.a_id FROM a_mst WHERE a_mst.a_price >= 100 AND a_mst.a_price <= 200 AND a_mst.a_print_flg = 0 SQLのSELECT にCOUNT等は使わない方がいいようなので主キーのみを出力させて count関数で件数を求めています。 このSQL文をEXPLAINでphpMyadminで実行すると id=1       select_type=SIMPLE   table=a_mst type=ALL    possible_keys=NULL   key=NULL key_len=NULL  ref=NUL          rows=a_mstに登録してある件数 Extra=Using where でした。SQL文自体はあるマスタにあるデータから値が100~200のもので、フラグが0のものを 出力するというシンプルなSQL文なのでどう改善すればよいのでしょうか? (例2) 2つのテーブルを結合させて条件一致したデータをそれぞれテーブルから出力 SELECT a_mst.a_name, a_mst.a_price, b_mst.b_data FROM a_mst, b_mst WHERE a_mst.a_id = b_mst.b_id AND a_mst.a_price >= 100 AND a_mst.a_price <= 200 AND a_mst.a_print_flg = 0 ORDER BY a_mst.a_price , a_mst.a_id asc LIMIT 20 OFFSET 0 です。a_mstとb_mstをidで結合させて条件一致したあとにそれぞれの テーブルデータをSELECTしています。実際のSQL文はSELECT させている項目数は多いです。 このSQL文をEXPLAINでphpMyadminで実行すると <1行目> id=1       select_type=SIMPLE    table=b_mst type=ALL    possible_keys=PRIMARY key=NULL key_len=NULL  ref=NUL          rows=a_mstに登録してある件数 Extra=Using temporary; Using filesort <2行目> id=1        select_type=SIMPLE    table=a_mst type=eq_ref    possible_keys=PRIMARY  key=PRIMARY key_len=NULL   ref=b_mst.b_id       rows=1 Extra=Using where でした。 EXPLAINを使ったチューニングなどしたことないSQL低級者なのでどのようなSQL文にすればtypeがALLの場合や、ExtraからUsing temporary; Using filesortを消すことができるのか分からないので教えて下さる方がいましたらよろしくお願いします。 ちなみに、a_mstとb_mstはphpMyadminにてそれぞれのテーブルの「構造」を見ると 「インデックスサイズ」のところで、それぞれの主キーであるa_idとb_idがPLIMARY で登録させています。編集ボタンを押したら「インデックスを修正する」画面に変わるので一応それぞれインデックス登録はされているのかな?と思います。

  • MYSQLとの連動のselect文で

    $dbh = @mysql_connect( $host , $id , $pw ); mysql_select_db( $id , $dbh ); mysql_query( "SET NAMES UJIS" ); $str = "select * from login_data where sid = '$sid' and spass = '$spass'";   $result = mysql_query( $str ); $rec = mysql_fetch_array( $result ); 上記のようにDBに登録されているidとpassの一致した情報を取り出したいのですが、「$result」が何を入れてもfalseになってしまいます。 「$str」をprintで出力したものを直接phpmyadminのSQLに流し込むと普通に情報を取ってこれるのですが、プログラムのmysql_query()がうまく動きません。 どなたかお分かりになる方いましたら是非教えていただけませんでしょうか。 よろしくお願い致します。

    • 締切済み
    • PHP