MySQLでJOINとUNIONを二つ使う事って出来るのでしょうか?



"SELECT * FROM profile INNER JOIN address ON profile.address=address.address_id UNION SELECT * FROM mydata";

上記のようなsqlを書いたのですが、エラーになります。
上記は、「profile」テーブルのaddressフィールドをaddressテーブルのIDと結合して、住所名を読み込みたいという意味です。mydateとは、profileとは別のテーブルで、addressフィールドを結合する必要がないとします。

もし、UNIONさせるテーブルにJOINで別のテーブルを結合させる方法がありましたら、コードを教えていただければと思います。(できれば、WHEREやORDER BYをする場合の注意点なども)

MySQLは4.x系以上でお願いします。
尚、出力時はPHPで出力して確認しています。

回答の条件
  • 1人2回まで
  • 登録:2007/10/04 20:21:38
  • 終了:2007/10/04 23:43:43

回答(1件)

id:un0 No.1

un0回答回数651ベストアンサー獲得回数322007/10/04 23:21:49

ポイント60pt

UNION の前半と後半の*で選択されるフィールドが異なっているからだと思います。

それぞれ明示的に合わせて指定してみてはいかがでしょうか。

【前半部】

SELECT a,b,c FROM profile INNER JOIN address ON profile.address=address.address_id

【後半部】

SELECT a,b,c FROM mydata

参考になれば幸いです。

id:kt26

回答ありがとうございます。コメントでいただいたMookさんの参考サイトなどを見ながら、ようやく意味を把握出来ました。

2007/10/04 23:42:59
  • id:Mook
    http://www.atmarkit.co.jp/fnetwork/rensai/sql09/sql1.html
    にあるように

    ----------------------------------------------------------------------------------------------
     UNION句でマージする複数のSELECT文は、2つの条件を満たしている必要があります。

    (1) SELECT句に指定するカラムのデータ型が同じか、もしくは、変換可能であること
    (2) SELECT句のカラム数が同じこと
    ----------------------------------------------------------------------------------------------

    の条件を満たしていないからではないでしょうか。
  • id:kt26
    つまり、2を満たしていたとしても、profileテーブルはJOINしているから、1は満たしていない。

    と言うことですかね?片方だけJOINとか出来ないのかな・・・。
  • id:b-wind
    >片方だけJOINとか出来ないのかな・・・。
    ダミーのデータを指定して数合わせすればいい。

    SELECT a,b,c,NULL,NULL FROM mydata
    とか。

    * での指定はカラムの順序が明確でない場合があるので UNION の場合は明示したほうがいい。
  • id:F-15X
    あと、型が異なる場合は、キャスト関数で型変換ですかね。
    http://dev.mysql.com/doc/refman/4.1/ja/cast-functions.html
  • id:kt26
    更にコメントありがとうございます。参考になりました。

    あと、WHEREする時は、それぞれのテーブルに対して必要なんですね。

    SELECT abc FROM profile WHERE a='1' UNION SELECT abc FROM mydata WHERE a='1'

    みたいな。GROUP BYもそうでした。

    正規化する為に結構テーブルを分けたり構成を変えたりすることがあるので、もう少し柔軟に使えるよう、勉強します。また何かありましたらお願いします。いつもありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません