• ベストアンサー

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

webuserの回答

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

>実は、裏ではこのような処理はされています。 >今回質問するにあたり、テーブルを複数書くと混乱するので、三つのテーブルとしています。 ですよね。 業務用の場合、項目1つに対してコードと名称がセットになってますが、話をする時には複雑になるので省いていると。。 でも、多分話を省略する時に間違えて書いてる気がします。 テーブルの構成がわからないので問い合わせを発行する段階まで考えが行かないのです。 とりあえず、コードを置いといて名称だけに正規化しますと table_a(ID,識別種別ID,識別項目ID) Aさん,1,1 Aさん,2,4 Bさん,1,1 Bさん,2,5 Cさん,1,2 Cさん,2,6 Dさん,1,3 Dさん,2,4 table_b(識別種別ID,識別種別名) 1,手 2,頭 table_c(識別項目ID,識別項目名,識別種別ID) 1,1,二本 2,1,四本 3,1,複数 4,2,悪い 5,2,良い 6,2,普通 この辺で行き詰るでしょ? 多分table_cのデータが識別項目名と識別種別IDが逆になってるのでしょうが・・・ だとして話を続けます。 table_c(識別項目ID,識別項目名,識別種別ID) 1,二本,1 2,四本,1 3,複数,1 4,悪い,2 5,良い,2 6,普通,2 そして識別種別IDはtable_bと共通なので名称に置き換えると table_cX(識別項目ID,識別項目名,識別種別名) 1,二本,手 2,四本,手 3,複数,手 4,悪い,頭 5,良い,頭 6,普通,頭 table_aX(ID,識別種別名,識別項目ID) Aさん,手,1 Aさん,頭,4 Bさん,手,1 Bさん,頭,5 Cさん,手,2 Cさん,頭,6 Dさん,手,3 Dさん,頭,4 うーん、やっぱりおかしい。 テーブルAで識別項目持ってるなら識別種別持っても意味が無いし。。。 テーブル1 Aさん,1 Aさん,4 Bさん,1 Bさん,5 Cさん,2 Cさん,6 Dさん,3 Dさん,4 テーブル2 1,手,二本 2,手,四本 3,手,複数 4,頭,悪い 5,頭,良い 6,頭,普通 もしくは テーブル1 Aさん,手,二本 Aさん,頭,悪い Bさん,手,二本 Bさん,頭,良い Cさん,手,四本 Cさん,頭,普通 Dさん,手,複数 Dさん,頭,悪い コードを省いて考えると、このどちらかの形になると思うのですが。。 >select * from table_a where id_c = '1' and id_c = '5'; >と言うようなことをして B が一つだけ出てくるのが理想です。 ですから、一つだけ出すにはIDが固有なテーブルも書いた方がいいです。 仮にIDと名称だけのテーブルtable_dがあるとして考えた方が分かりやすいかもしれません。

moon_night
質問者

補足

再度の回答ありがとうございます。 詳細な解説をありがとうございました。 >テーブルAで識別項目持ってるなら識別種別持っても意味が無いし。。。 じつは、第一の目的は質問に書いた通りですが、 第二の目的が、 「手が二本の人で、頭の種類をつけた人を全て表示する」 と言うのをやることを視野に入れてこのようなテーブルになっています。 実際のテーブルはもっといろいろなデータがあるのですが、やりたいことを単純化するためにこのようなテーブルとしました。 詳細なことを言いますと、コンビニの客層データの集計みたいなことをしたいわけです。 会計ID(table_aのID)にぶら下がって、客層種類と客層項目があります。 客層Aの項目がaだった場合の客層Bの分布や、 さらに客層Bがaだった場合の客層Cの分布といった感じです。 (会計IDから売上や売り上げた商品を集計するなども取得します。これは別件なので割愛。) 少し込み入った話になりそうでしたので、単純化して説明させていただきました。 #2さんのようにやればできそうですので、そちらで検討しようと思います。

関連する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となるようにテーブル定義を変えたいのですが 既存のテーブルをそのままで、途中から変更する方法が知りたいです。