SELECT文で片方のテーブルを優先したい

このQ&Aのポイント
  • 以下の3つのテーブルから、idとcountの結果を優先的に取得したいです。
  • tableIDのすべてのIDに対して、table2に見つかればtable2のIDとcountを取得し、見つからずtable1に見つかればtable1のIDとcountを取得します。
  • 両方のテーブルにIDが存在しない場合はnullを返します。
回答を見る
  • ベストアンサー

SELECT文で片方のテーブルを優先したい

以下の3つのテーブルから、下記のような結果を得たいです。 table1:PK=id id(int), count(int) ------------------- 1, 11 2, 12 3, 13 5, 15 table2:PK=id ------------------- id(int), count(int) 1, 21 2, 22 4, 24 tableID:PK=id id(int) ------------------- 1 2 3 4 5 6 得たい結果 tableIDのすべてのIDに対して、 table2に見つかればtable2のID、 table2に見つからずtable1に見つかればtable1のID、 両方になければnull id, count ---------- 1, 21 2, 22 3, 13 4, 24 5, 15 6, null よろしくお願いいたします。

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

  • ベストアンサー
  • rsb28206
  • ベストアンサー率100% (1/1)
回答No.1

一応結果は出たので参考程度に・・・ select a.id, coalesce(c.count, b.count, null) from tableid as a left join table1 as b on(a.id = b.id) left join table2 as c on(a.id = c.id) order by a.id coalesce() リスト内の最初の非NULL要素を返す。

03-mari
質問者

お礼

coalesce()という関数が使えるのですね! 助かりました、どうもありがとうございます^^

関連するQ&A

  • SQLのSELECT文について

    以下の注文テーブルで、注文件数と送料と注文合計金額を一度に取得する場合、以下のようなSQL文で合っていますか? "SELECT order.total, order.delivery_fee, SUM(order.total * order.tax) AS total_for_paying FROM order"; CREATE TABLE `order` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, `status` tinyint(3) UNSIGNED NOT NULL DEFAULT '0', `order_payment_status` tinyint(3) UNSIGNED NOT NULL DEFAULT '0', `buyer_id` bigint(20) UNSIGNED NOT NULL, `discount` INT(11) UNSIGNED NOT NULL, `delivery_fee` INT(11) UNSIGNED NOT NULL, `charge` INT(11) UNSIGNED NOT NULL, `total` INT(11) UNSIGNED NOT NULL, `tax` INT(11) UNSIGNED NOT NULL, `total_with_tax` INT(11) UNSIGNED NOT NULL, `total_for_paying` INT(11) UNSIGNED NOT NULL, `use_point` INT(11) UNSIGNED NOT NULL, `created` DATETIME NOT NULL, `updated` DATETIME NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

    • ベストアンサー
    • MySQL
  • insert、selectのやり方を教えて下さい

    こんにちは。 すみません、ネットで調べていたのですが、見当もつかなかったので、教えていただけないでしょうか? ---------------------------------------------- テーブル1:t1 c1 char(254)not null unique,c2 int,c3 int あ,3,null い,4,null う,2,null ---------------------------------------------- テーブル2:t2 c1 char(254)not null unique,c2 int,c3 int い,null,9 う,null,12 え,null,13 お,null,11 ---------------------------------------------- 上記の2つのテーブルがあるとします。そのときに、下記のような結果を新たなテーブルに出力するには、どのような、insert、selectが良いのでしょうか? ---------------------------------------------- テーブル3:result c1 char(254)not null unique,c2 int,c3 int あ,3,null い,4,9 う,2,12 え,null,13 お,null,11 ---------------------------------------------- 困っています。お願いします。

  • 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
  • MySQLのSELECT文の書き方

    MySQLで以下のようなテーブルがあります 【テーブル名】table_title id │ title ───── 1 │ あ 2 │ い 3 │ う 4 │ え 5 │ お 【テーブル名】table_data id │ data ───── 1 │ a 2 │ i 3 │ u 4 │ e 5 │ o 【テーブル名】table_cat id │ cat ───── 1 │ 1 1 │ 2 1 │ 3 2 │ 1 2 │ 3 3 │ 2 3 │ 5 4 │ 2 4 │ 3 5 │ 1 5 │ 2 5 │ 3 ここからPHPで以下のような配列にしたいのですが、可能でしょうか? Array ( [0] => Array ( [id] => 1 [title] => あ [cat] => Array ( [0] => 1 [0] => 2 [0] => 3 ) ) [1] => Array ( [id] => 2 [title] => い [cat] => Array ( [0] => 1 [0] => 3 ) ) [2] => Array ( [id] => 3 [title] => う [cat] => Array ( [0] => 2 [0] => 5 ) ) [3] => Array ( [id] => 4 [title] => え [cat] => Array ( [0] => 2 [0] => 3 ) ) [4] => Array ( [id] => 5 [title] => お [cat] => Array ( [0] => 1 [0] => 2 [0] => 3 ) ) )

    • ベストアンサー
    • MySQL
  • このようなテーブルを取得するSELECT文は?

    テーブルtb1が以下のようになっているとします id, region, station1, station2, station3, station4, station5 0, 東京, 池袋駅, 渋谷駅, null, 新宿駅, null 1, 横浜, null, 横浜駅, 戸塚駅, 菊名駅, 反町駅 2, 大阪, 梅田駅, 天満駅, 野田駅, null, null このようなテーブルを、以下のような結果として取得するSELECT文はどのようになるのでしょうか? 0, 東京, 0, 東京, 池袋駅 0, 東京, 渋谷駅 0, 東京, 新宿駅 1, 横浜, 1, 横浜, 横浜駅 1, 横浜, 戸塚駅 1, 横浜, 菊名駅 1, 横浜, 反町駅 2, 大阪, 2, 大阪, 大阪駅 2, 大阪, 梅田駅 2, 大阪, 野田駅 複数の列を行にするのがわかりません。 そもそも、tb1の設計が良くないのですが、これは変えられないと先方に言われました。 どうぞよろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 2つのテーブルの結合に関してです

    お世話になります PHP5,MySql5.0.33にて開発を行っています 2つのテーブルの結合部分で困っています TABLE1 ---------------------------------- ID DATE1 DATE2  COUNT ---------------------------------- 1  2/27  2/20  10 2  2/27  2/20  10 ---------------------------------- TABLE2 ---------------------------------- ID DATE1 DATE2 COUNT ---------------------------------- 1  2/21  2/26  5 2  2/21  2/27  5 ---------------------------------- 上記2つのテーブル(TABLE1/TABLE2)から TABLE1のDATE1=2/27より過去の行とTABLE2のDATE2=2/27より過去の行を 取得したいのですが上手くいかず…(下SQLで記述しています) SELECT DISTINCT TABLE1.* FROM TABLE1,TABLE2 WHERE TABLE1.ID=TABLE2.ID AND TABLE1.ID=1 AND (TABLE1.DATE1<='2009/2/27' OR TABLE2.DATE2<='2009/2/27') (結合のそもそもの理解が間違っているかも知れませんが…;) 宜しくお願いします

    • ベストアンサー
    • MySQL
  • 作成したテーブルが存在していないように扱われる

    create table 発明者 (id int); とし, show tables; としても,テーブルはないと言われますが(ほかにテーブルがないので) select count(*) from 発明者; などとすると count (*) 0 と返ってきます. この例は現象確認のための作りましたが, テーブル名は同じです. mysqlのバージョンは5.0.41です. お心当たりのある方,アドバイス賜れば幸いです. よろしくお願いいたします.

    • ベストアンサー
    • MySQL
  • 3テーブル外部結合&やっかいな条件

    ORACLE10gを使用しています。 下記のようなTABLE1,2,3があります。 TABLE1の全てを抽出し、TABLE2に該当レコードがあれば、TABLE2のBUMON_CDを使ってTABLE3のNMを取得したいです。 TABLE1とTABLE2の結合条件は TABLE1.CD = TABLE2.CD AND TABLE2.DATE >= TABLE1.DATE TABLE2に該当レコードが複数ある場合はTABLE1.DATEに最も近いレコード(TABLE2)を抽出したいのです。 サブクエリと外部結合を使用するのは想像できるのですが、TABLE1,TABLE2ともに同一CDのレコードが複数存在する中からTABLE1とTABLE2のレコードをどのようにぶつければいのか分からなくなってしまいました。アドバイスお願いします。 【TABLE1】 DATE   |CD -------------- 2006/08/15|01 2006/08/20|01 2006/08/03|02 【TABLE2】 CD|DATE   |BUMON_CD ---------------------- 01|2006/08/17|0102 01|2006/08/18|0101 【TABLE3】 ID|KBN_CD|NM ----------------------- 1 |0101 |サービス部門 1 |0102 |営業部門 【求める結果】 CD|BUMON_CD|NM ----------------------- 01|NULL  |NULL 01|0101  |サービス部門 02|NULL  |NULL

  • 二つのテーブルから一文でセレクトするには?

    以下の二つのテーブルがあるとします。 在庫テーブル zaiko_table id | name | zaiko ------------------- 1 |みかん| 1 ------------------- 2 |りんご| 0 ------------------- 3 |とまと| 1 ------------------- 販売テーブル hanbai_table id | day | tenki ------------------- 1 | 3-2 | 晴れ ------------------- 2 | 3-2 | 晴れ ------------------- 1 | 3-1 | 雨 ------------------- 在庫テーブルのIDはその商品のプライマリーキーです zaikoは1なら在庫有り、2なら在庫なしとします。 販売テーブルのIDは在庫テーブルで決めた商品を表しています。 dayは売れた日付、tenkiはその日の天気です。 3月2日に売れた商品でまだ在庫のある物をセレクトしたいと思います。 該当する商品の名前とそれが売れた日の天気が知りたいのです。 これを一回のSQL文の発行で済ませたいときはどの様に書くのでしょうか?

  • SQL文 テーブルの作成方法について

    以下のようなTABLE1からTABLE2というテーブルを作成したいと考えております。 元テーブル(TABLE1)は、IDという項目がキーとなってデータが入っており、NAME1とNAME2という項目があります。 (NAME1は必ず値が入っていますが、NAME2は値が入っていない場合もあります) 加工後のテーブル(TABLE2)で、NAME1とNAME2の値を結合した形で結果を出力したいと考えております。 (新たに作成したNAMEカラムは、必ずしもユニークになっているとは限りません。NAMEとIDを組み合わせるとユニークになります) ---------------------------------------------------- ■ TABLE1 ID NAME1 NAME1_CATE NAME2 NAME2_CATE ---------------------------------------------------- 001 鈴木 A 山田 B 002 山本 A 003 佐藤 A 高橋 B ---------------------------------------------------- ---------------------------------------------------- ■ TABLE2 ID NAME NAME_CATE ---------------------------------------------------- 001 鈴木 A 001 山田 B 002 山本 A 003 佐藤 A 003 高橋 B ・・・ ---------------------------------------------------- いろいろ試していますが、どのようなSQL文を書いたらよいのか分かりません。 現状のSQL(エラーとなります) ====================================================================================== SELECT ID, NAME, NAME_CATE FROM (SELECT ID, NAME1 as NAME, NAME1_CATE as NAME_CATE FROM TABLE1 WHERE NAME1<>NULL) JOIN (SELECT ID, NAME2 as NAME, NAME2_CATE as NAME_CATE FROM TABLE1 WHERE NAME2<>NULL) ====================================================================================== 初歩的な質問になるかと思ってしまうかと思いますが、よろしくお願いいたします。