質問: unionについて お世話になっております。unionについて伺いたいことあり質問させていただきます。(mysql5.1系) 2つのテーブルがあり、縦に?検索したくunionを使ってsql文を作ってみました。 この検索対象となる2つのテーブルは構成も違えば、カラム名も違うのですが、 select name, address from member union select c_name, c_address from class とこのようにしたら欲していた結果を得ることが出来ました。 そ、ここで質問なのですが、今回、unionを使うのは初めてなのですが、色々と調べていると、 unionを使うときは、カラム名が同一なものが条件のように書かれているものが多くあり、 多くのサイトのサンプルソースを見てみると、以下のようにカラム名が同一なものばかりと、 そんな印象があるのですが、unionを使う場合は、カラム名が同一でないと駄目なのでしょうか? select name, address from member union select c_name, c_address from class また、もう1点伺いたいのですが、unionを使い、order byを場合、以下のように select文ごとにカッコで括るとも調べたのですが、結果は何も変わらない状態になっています。 (select no, name, address from member order by no desc) union (select c_no, c_name, c_address from class order by c_no desc) 上記にあるように、テーブル名classのorder by c_no descが利くようにするには どのようにすべきなのでしょうか? お忙しい中恐縮ですが、宜しくお願い申し上げます。
回答: >そんな印象があるのですが、unionを使う場合は、カラム名が同一でないと駄目なのでしょうか? テーブルのカラム名は何でもいいです。 エイリアス(別名)でカラム名を同じにすればよい事なので。 また、属性も同じである必要があります。 ところで、今、手元に mysql がないので確認できないのですが、以下の書き方で mysql はエラーにならないんでしたっけ? >select name, address from member >union >select c_name, c_address from class 普通はこのようにエイリアスでカラム名を合わせて書くのではないかと。。 ↓ select name, address from member union select c_name name, c_address as name from class >上記にあるように、テーブル名classのorder by c_no descが利くようにするには どのようにすべきなのでしょうか? インライビュー同士のunionではなく、unionのインラインビューでないとソートは効かないと思います。 (mysqlに限らず、oracleでもpostgresqlでもmssqlでも同様) これでどうでしょうか? ↓ select v.no, v.name, v.address from ( select no, name, address from member union select c_no no, c_name name, c_address address from class ) v order by v.no desc