• ベストアンサー

同じフィールドを複数条件指定して検索をする場合

webuserの回答

  • webuser
  • ベストアンサー率33% (372/1120)
回答No.1

テーブル構造について table_bは上位区分情報ですね <table_b> 上位区分Key,上位区分名称 a1,手 a2,頭 問題ありません。 table_cは下位区分情報ですね <table_c> 固有Key,上位区分Key,下位区分名称 b1,a1,二本 b2,a1,四本 b3,a1,複数 b4,a2,悪い b5,a2,良い b6,a2,普通 ここは通常は下位区分Keyも持ちますね。 <table_c・改> 固有Key,上位区分Key,下位区分Key,下位区分名称 b1,a1,c1,二本 b2,a1,c2,四本 b3,a1,c3,複数 b4,a2,c1,悪い b5,a2,c2,良い b6,a2,c3,普通 table_aは人の詳細情報ですね。 人単位の情報を検索するなら、まず「人基本情報」をつくる事から設計しては如何ですか? <人基本情報> 名前Key,名前 d1,Aさん d2,Bさん d3,Cさん d4,Dさん で一番普通なのは、ここに手情報と頭情報を項目として持つ。 <人基本情報・改> 名前Key,名前,手情報key,頭情報key d1,Aさん,c1,c1 d2,Bさん,c1,c2 d3,Cさん,c2,c3 d4,Dさん,c3,c1 この状態だと select 名前 from 人基本情報・改 where 手情報key=c1,頭情報key=c2 で簡単に取得できます。 または、手と頭の情報を項目として持ちたくないなら、 人基本情報はそのままで、下位の「人詳細情報」を持つ。 <人詳細情報> 名前Key,上位区分Key,下位区分Key d1,a1,c1 d1,a2,c1 d2,a1,c1 d2,a2,c2 d3,a1,c2 d3,a2,c3 d4,a1,c3 d4,a2,c1 この状態だと人基本情報にselectして、 人詳細情報側で条件抽出して名前Keyで繋げばOK ※keyは色分けのためにa,b,c,dと入れています。

moon_night
質問者

補足

回答ありがとうございます。 >人単位の情報を検索するなら、まず「人基本情報」をつくる事から設計しては如何ですか? ><人基本情報> >名前Key,名前 >d1,Aさん >d2,Bさん >d3,Cさん >d4,Dさん 実は、裏ではこのような処理はされています。 今回質問するにあたり、テーブルを複数書くと混乱するので、三つのテーブルとしています。 また、 >で一番普通なのは、ここに手情報と頭情報を項目として持つ。 ><人基本情報・改> >名前Key,名前,手情報key,頭情報key も、質問の条件で記したとおり、手や頭のほかに、足や性格や目など、Keyが増減する場合があるのでつかえません。 (ユーザー側で設定を追加できるのでKeyの数が不定なのです) 今回はテーブル情報(設計)の質問と言うよりは、検索(集計)方法の質問です。 ただし、この集計を実現させるためにテーブルを変更したほうが楽な場合はそちらを採用しようかと思っています。 あと訂正ですが、 >検索:手が二本で頭が良い人 >結果:A の結果は Bです。間違えました。 感じとしては select * from table_a where id_c = '1' and id_c = '5'; と言うようなことをして B が一つだけ出てくるのが理想です。

関連するQ&A

  • 同一テーブルの同一フィールドで複数条件 and 指定

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1069795 で質問した続きです。 うっかり詳細のテストをしてないのに締め切ってしまいました。 テーブルA 「member」 | id | name | テーブルB 「item」 | id | name | テーブルC 「item_check」 | member_id | item_id | というテーブルがあります。 テーブルAはメンバーで一人一つのデータが入っています。 テーブルBはメンバーが持つであろうアイテムのマスタです。 テーブルCはメンバーがどのアイテムを持っているかを示しているテーブルです。 テーブルCに関しては同じメンバーでも複数のアイテムを持つこともあるので複数のデータが入る場合もあります。 で、やろうとしているのは、 「アイテムA と アイテムBを持っているメンバー」 という検索を行いたいのです。 select distinct a.id, a.name from member as a,item as b,item_check as c where a.id = c.member_id and c.item_id = b.id and (c.item_id = '2' or c.item_id = '3') select member.*,item.name from member, item, item_check where member.id=item_check.member_id and item.id=item_check.item_id and item.id in (1, 3) group by member.id で or 検索はできますが、 and 検索をすると 「Empty set」となってしまいます。 select distinct a.id, a.name from member as a,item as b,item_check as c where a.id = c.member_id and c.item_id = b.id and (c.item_id = '2' and c.item_id = '3') なにかいい手はないでしょうか。

    • ベストアンサー
    • MySQL
  • テーブル結合の条件指定について

    以下のようなテーブルが3つある場合に2つのテーブルにあるポイントを合計して取得したいと思っています。 ただ、外部結合しているtable_cに条件を与えるとうまく取得できません。 table_cにcdがある場合は条件を指定し、 ない場合は条件を指定しないようにするにはどうすればいいのでしょうか。 【table_a】 id    name ------------------ a1    aaa a2    bbb a3    ccc 【table_b】 b_id     a_id   user_id    point --------------------------------- b1     a1    00001    5 b2     a1    00002    2 b3     a3    00007    10 b4     a2    00356    10 【table_c】 c_id    user_id    cd     bonus_point ------------------------------------------------ c1     00001    cd_1    1 c2     00007    cd_2    1 c3     00356    cd_1    1 SELECT table_b.user_id as user_id , (ifnull(table_b.age_count) + ifnull(table_c.bonus_point, 0)) as total_point FROM table_a INNER JOIN table_b ON (table_b.a_id=table_a.a_id)    LEFT JOIN table_c ON (table_c.user_id=table_b.user_id) WHERE table_c.cd = 'cd_1' ORDER BY total_point desc ■結果 user_id    total_point ----------------------------- 00356     11 00001      6 ■求めたい結果 user_id    total_point ----------------------------- 00356     11 00001      6 00002     2 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 同一テーブルの同一フィールドで複数条件指定

    例を挙げます。 テーブルA 「member」 | ID | 名前 | テーブルB 「item」 | ID | 名前 | テーブルC 「item_check」 | member.ID | item.ID | というテーブルがあります。 テーブルAはメンバーで一人一つのデータが入っています。 テーブルBはメンバーが持つであろうアイテムのマスタです。 テーブルCはメンバーがどのアイテムを持っているかを示しているテーブルです。 テーブルCに関しては同じメンバーでも複数のアイテムを持つこともあるので複数のデータが入る場合もあります。 で、やろうとしているのは、 「アイテムA と アイテムBを持っているメンバー」 という検索を行いたいのです。 同じテーブル上ならば select * from member where item1 = "A" and item2 = 'B' ... ; と、いくつでも条件が指定可能なのですが、 同じテーブルの同じフィールドを同じメンバーで複数条件指定して検索することはできるのでしょうか。 私が考えたのは一回ではできないで、 まずは一つの条件を出して while でループさせて条件を付け足してやるような効率が悪そうなものです。 (少ない件数ならばいいのですが、数千~数万件の検索になりそうなので手軽にできればと思いまして・・・) アイテムは不特定なので、1個から数十個とかの検索もありえます。 何かいい手はないでしょうか。

    • ベストアンサー
    • MySQL
  • 再投稿:フィールドの値をテーブル名&フィールド名にして参照したい

    すみません。若干記入ミスだったので再投稿します。 こちらにご解答お願いします。 TABLE_a ・Ta_id ・key_table ・key_field ・key_no TABLE_b ・Tb_id ・Tb_name TABLE_c ・Tc_id ・Tc_name と3つのテーブルがあり、 key_tableに「TABLE_b」、key_fieldに「Tb_id」が入ってて、 TABLE_aとTABLE_bを select の left join して抽出したい場合、 どういうSQL文になるのでしょうか。 select * from TABLE_a left join case key_table when 'TABLE_b' then 'TABLE_b' when 'TABLE_c' then 'TABLE_c' end on 'TABLE_a.key_field'.key_no = case key_table when 'TABLE_b' then ''TABLE_a.key_table'.Tb_id' when 'TABLE_c' then ''TABLE_a.key_table'.Tc_id' end ; とやってみたのですが、うまくできませんでした。 ご教示お願いします。

  • テーブル結合で、結合フィールドをWHERE句に用いた時に、結合フィールドのデータがNULLになってしまう。

    MySQL 4.0.24-standard + PHP Version 4.3.11 を使用しています。 下記のような table_a, table_b があり、idフィールドで外部結合させています。 table_a id|value ------- 1 | 0 2 | 1 table_b id|name ------- 1 | A 2 | B SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b; result id|value|name -------------- 1 | 0 | A 2 | 1 | B しかし、下記のクエリでは、このようにidがNULLになってしまいます。 SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b WHERE table_a.id = 1; result id |value|name -------------- NULL| 0 | A 以下のような結果を得たいのですが、どうすれば良いのでしょうか? result id|value|name -------------- 1 | 0 | A

    • ベストアンサー
    • MySQL
  • CakePHPのアソシエーションがうまくいかず困っています。

    CakePHPのアソシエーションがうまくいかず困っています。 以下の3つのテーブルがあります。 [Table_A] id_a id_b name_a [Master_B] id_b name_b [Table_C] id_c id_a name_c Table_Aを中心にアソシエーションを設定しようと思い、modelを以下のように設定しました。 [Model A] class A extends AppModel { public $name = 'A'; public $useTable = 'Table_A'; public $primaryKey = 'id_a'; public $hasOne = array( 'C' => array('className' => 'C', 'foreignKey' => 'id_c' ) ); } [Model B] class B extends AppModel { public $name = 'B'; public $useTable = 'Table_B'; public $primaryKey = 'id_b'; } [Model C] class C extends AppModel { public $name = 'C'; public $useTable = 'Table_C'; public $primaryKey = 'id_c'; } そして、Controllerを以下のように設定しました。 [Controller A] $a = $this->A->find('all'); Controller Aでfindした結果、name_aとname_cの取得には成功しました。 そこでname_bも取得しようとしたのですが、どのようにアソシエーションを設定すればよいか、わかりません。 テーブルの項目は固定であり変更できないため、なんとかこれでアソシエーションを設定したいと思っています。 マニュアルやウェブサイトを調べたのですが、わかりませんでした。 ご教授のほどよろしくお願いいたします。

    • 締切済み
    • PHP
  • 複数のテーブルの検索について

    お世話になっております。 題名にありますように、複数のテーブルに登録のあるデータを、テキストフォームやチェックボックス、プルダウンなどのフォームで入力(選択)されたものを(PHPにて)検索したいと考えておりますが、googleなどで調べていても、キーワードが適切でないためか、得たい情報を得られずにおります。 以下のようなテーブル構成で、上記質問のような検索をする場合、(googleなどで検索するには)どのようなキーワードが適切でしょうか?ソースを教えていただくのが簡単ですが、理解を深めたいと考えての質問です。お忙しい中恐縮ですが、アドバイスのほど宜しくお願いいたします。 table_a id name address category table_b no id title subject 上記テーブルA、Bに設定されたフィールドを、各フォームににて入力(選択)されたフォームで一括で検索するソースを学びたいのです。 ※table_a と table_b にある id で紐付けています。

  • SQLで・・

    すみません、教えてください。 次のようなデータがあります。 table_A Name1 Name2 ----------- 1   2 3   4 table_B ID    Name --------------- 1     あ 2     い 3     う 4     え 次のような検索結果が欲しいとします。 Name1 Name2 ------------- あ    い う    え この結果を導くSELECT文はどう書けばいいでしょうか? 今、 select B.Name as Name1, C.Name as Name2 from table_A A, table_B B, table_B C where A.Name1=B.ID AND A.Name2=C.ID とやってみましたが、検索結果は0件になってしまいます。 お知恵をお貸しください!

  • SQLを教えて下さい

    SQL文を教えて下さい 以下の2つのテーブルがあります。 TABLE1 --------------- ID,NAME,PRICE --------------- 1,部品A,100 2,部品B,200 3,部品C,300 TABLE2 --------------- ID,NAME,PRICE --------------- 1,部品Aのサブ1,1 1,部品Aのサブ2,2 2,部品Bのサブ1,5 2,部品Bのサブ2,5 --------------- SELECT TABLE1.NAME TABLE2.NAME TABLE1.PRICE TABLE2.PRICE WHERE TABLE1.ID = TABLE2.ID(+) TABLE2.PRICE = (SELECT MAX(?) ?) 期待する結果 ・TABLE1.NAME = 部品Aの場合 --------------- 部品A,部品Aのサブ2,100,2 ・TABLE1.NAME = 部品Bの場合 --------------- 部品B,部品Bのサブ1,200,5 TABLE1.NAME = 部品Cの場合 --------------- 部品C,,300, ・TABLE1のNAMEに、TABLE2のNAMEが関連付く(付かないものもある) ・外部結合とMAX関数を用いたい。 ・TABLE2のPRICEが大きい方を取得(同一の場合は、どちらかを取得)

  • フィールドをデフォルト0にする

    フィールドをデフォルト0にする方法が知りたいです。 以下のようなサンプルがります。 drop table test_a; create table test_a ( name varchar2(10), a number(1), b number(1), c number(1) ) insert into test_a (name) values ('AAA'); insert into test_a (name,a) values ('BBB', NULL); insert into test_a (name,a,b) values ('CCC', NULL,NULL); select * from test_a; この状態では、a,b,cはNULLですが、a,b,cの値をデフォルト値で0にしたい為、 update test_a set a = 0, b = 0, c = 0; として、データを直して、次回から insert into test_a (name) values ('DDD'); とすると、nameがDDDの時もa,b,cが0となるようにテーブル定義を変えたいのですが 既存のテーブルをそのままで、途中から変更する方法が知りたいです。