• ベストアンサー

複数のテーブルから情報を引き出して整理

「去年の登録者」「今年の登録者」というテーブルがあるとします。 カラムは両方とも「名前」「性別」「年齢」があり、人物の情報が入ってます。 両方にデータが入ってる人もいれば、片方にしかデータが入ってない人もいます。 この2つのテーブルから男性のデータを引き出し 名前 去年の年齢 今年の年齢 太郎 21歳    22歳 二郎 24歳    データなし 三郎 データなし 20歳 このようにしたいのですがsql文が思いつきません。 アドバイスをください。

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

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

今回の件は完全外部結合と呼ばれるタイプの処理です MySQLの場合、ネイティブな機能の搭載が遅れているため とりあえずは結合のキーになる項目をunionで総ざらいし、そこに 各テーブルをjoinしていきます 具体的にはこんな感じ //元データ create table lastyear (name varchar(30),age int); insert into lastyear values('taro',21),('jiro',24); create table thisyear (name varchar(30),age int); insert into thisyear values('taro',22),('saburo',20); //表示 select t1.name ,t2.age as lastage ,t3.age as thisage from (select name from lastyear union select name from thisyear ) as t1 left join lastyear as t2 on t1.name=t2.name left join thisyear as t3 on t1.name=t3.name;

poniponi69
質問者

補足

素晴らしいです!! 期待通りに返ってきました。 ちなみにこれはどれくらいのデータ数までなら問題ないのでしょう?

その他の回答 (1)

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

>ちなみにこれはどれくらいのデータ数までなら問題ないのでしょう? うーん、経験的にはインデックスさえきちんと貼ってあれば 数万件程度は実用レベルで使えるような気がします。 ちなみに「今年」とか「年齢」という不確かな定義(変化してしまうもの)を 格納しておくのはあまりお勧めできません。 (もちろん4/1時点での年齢など一定の条件がつけば別) 蛇足ですがデータの持ち方としては name,age,yearのような持ち方をしたテーブルを作った方が効率的かも //去年=2012、今年=2013としておけばよい create table user (name varchar(30),age int,year int,unique key(name,year)); insert into user values('taro',21,2012),('jiro',24,2012),('taro',22,2013),('saburo',20,2013); //結果 select name,sum(age*(year=2012)) as lastage,sum(age*(year=2013)) as thisage from user group by name ※だたし、データがない場合はnullではなく0が変えるので注意

poniponi69
質問者

お礼

補足までつけていただいてありがとうございます。 確かに変動するものを素で入力しておくのは利便上良くないですね・・・。 sql初心者の私には非常に参考になる意見なので嬉しいです。 テーブルの設計から考えなおすいい機会になりました。 丁寧にありがとうございました。

関連するQ&A