1176184009 MySQLのSQL文について質問です。


MySQLで普通のテーブルを結合して1つのテーブルにするような事は出来るのでしょうか?
表示イメージは画像添付の通りです。

互いのテーブルのフィールドを結合して1つの表にしたり、両方に一致するデータのみを結合したりというのはわかるのですが、表示イメージのように異なるテーブル同士を結合して出力する方法がわかりません。

もし、可能なら以下の点も併せて教えて下さい。

・表示イメージではフィールド数は同じだが、フィールド数が異なるテーブル同士を結合する事もできるのか
・order byやlimitも使えるのか


ズバリな回答をしていただいた方には100~200ポイントを進呈します。

回答の条件
  • URL必須
  • 1人1回まで
  • 登録:
  • 終了:2007/04/10 15:58:21
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:lains_you No.1

回答回数50ベストアンサー獲得回数10

ポイント90pt

UNION構文を使用することで実現できます。

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.1.2 UNION 構

 http://dev.mysql.com/doc/refman/4.1/ja/union.html

【例】

SELECT *
FROM `search_engine`
UNION ALL
SELECT *
FROM `es_site` 

・表示イメージではフィールド数は同じだが……

 SELECT文で列名を指定し、フィールド数を合わせれば可能です。

・order byやlimitも使えるのか

 使用できます。

id:kt26

回答ありがとうございます。ローカル環境で試したところ、目的通りに動きました。

また、異なるフィールドであっても共通する部分が一致したら合わせる事も出来ました。order by やlimitに関しても問題ないです。

大変参考になりました。

2007/04/10 15:54:13
id:OTTii No.2

回答回数28ベストアンサー獲得回数4

ポイント50pt

そういった用途の場合はUNIONが使えると思います。

サンプルを貼っておきます。

select * from ec_site union select * from search_engine order by name;

ごらんのようにorder句も使えます。

limitはどうやら無理そうです。

http://www.atmarkit.co.jp/fnetwork/rensai/sql09/sql1.html

id:kt26

回答ありがとうございます。limitは他者の方が答えてくれていますが、実験したところ可能でした。

2007/04/10 15:54:44
id:tokyosmash No.3

回答回数100ベストアンサー獲得回数6

ポイント90pt

union allを使えば可能です。。

http://dev.mysql.com/doc/refman/4.1/ja/union.html

kt26さんのテーブル情報だと

select * from search_engin union all select * from ec_site

このSQLで結合できます。

また、oreder byもlimitも使えます。

select * from search_engin union all select * from ec_site order by date limit 2

日付順に2つのみ抽出です。

参考になればと思います。

id:kt26

日付の事例も出していただき、ありがとうございます。わかりやすかったです。


皆さん、回答の意見が一致していますので、それぞれの方の回答文を判断してポイントを付与させていただきます。

2007/04/10 15:56:01
  • id:b-wind
    http://dev.mysql.com/doc/refman/4.1/ja/union.html
    >UNION の総結果に対して ORDER BY を適用する必要があるときは、かっこを使用します。
    ものの見事に全員これに触れていないのは何でだろ?
    そのままだと ORDER BY は後半のテーブルにしかかからないように思うのだけど。
  • id:lains_you
     リンク先に書いてあるからいいかな、と。
     結合後のデータに対してORDER BYとLIMITを適用するには以下のような感じですかね。


    (
    SELECT *
    FROM `Test1`
    )
    UNION ALL
    (
    SELECT *
    FROM `Test2`
    )
    ORDER BY date
    LIMIT 0 , 30
  • id:taknt
    それは、試してないからだね。

  • id:tokyosmash
    回答かぶってしまいましたね。すみません。

    >そのままだと ORDER BY は後半のテーブルにしかかからない
    あれ、そうなんですかね?
    実際に試してみましたがきちんと混ざっていたのでそのまま回答してしまいました。
    今もう一度試していますが、なぜか正常に表示されています。
    もうちょっと実験してみます。
  • id:tokyosmash
    質問者さんのテーブル情報から察するに

    date

    のみで並べ替えたいんだと思います。
    その場合は

    select * from search_engin union all select * from ec_site order by date limit 5

    括弧が無くても2つのテーブルをミックスした後にdateでソートしています。でもリファレンスが括弧を使えと書いているんだから使うべきなんでしょう。ちょっとそこまで確認していませんでした。浅はかですみません。

    もし、同じ日付のレコードが複数あってその中でもさらにソートしたい(ここではname)場合は

    (select * from search_engin order by name) union all (select * from ec_site )order by date limit 5

    このように括弧で2つのselectを囲む必要があるようです。


    ご指摘ありがとうございました。

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

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

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

回答リクエストを送信したユーザーはいません