mysql5の表結合の質問です。


テーブル名:master
フィールド名:id, name, cat_id
テーブル内容
1, 福岡, 1
3、宮崎, 1
2, 東京, 3
2, 千葉, 3

テーブル名:cat
フィールド名:cat_id, cat_name
テーブル内容
1, 九州
2, 四国
3, 関東


上記2つのテーブルをジョイントして、以下のような配列を作りたいのですがどのようにすればいいでしょうか?


配列名:area_array
cat_id, cat_name
1, 九州
3, 関東


インナージョインやレフトジョインをいろいろ試しますが思ったとおりに出力されません。
以上よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2009/06/05 16:57:19
  • 終了:2009/06/05 19:13:19

ベストアンサー

id:fester No.2

fester回答回数124ベストアンサー獲得回数202009/06/05 18:18:44

ポイント35pt

未確認ですがこちらでいかがでしょうか

SELECT cat_id, cat_name FROM cat

WHERE

EXISTS (

SELECT * FROM master

WHERE cat_id = cat.cat_id

)


id:seadwell

こちらも動作を確認しました。

しかし、こんなsql文はじめてみました。

またひとつ勉強になります。ありがとうございました。

2009/06/05 19:05:06

その他の回答(1件)

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752009/06/05 17:16:04

ポイント35pt

こんなSQLでどうでしょう?

SELECT
    DISTINCT(cat.id) AS cat_id,
    cat.cat_name     AS cat_name
FROM
    cat
    LEFT JOIN master ON cat.id = master.cat_id
WHERE
    master.id IS NOT NULL;
id:seadwell

動きました^^

DISTINCTで重複を省くんですね。

初めて知りました。ありがとうございます。

2009/06/05 19:04:00
id:fester No.2

fester回答回数124ベストアンサー獲得回数202009/06/05 18:18:44ここでベストアンサー

ポイント35pt

未確認ですがこちらでいかがでしょうか

SELECT cat_id, cat_name FROM cat

WHERE

EXISTS (

SELECT * FROM master

WHERE cat_id = cat.cat_id

)


id:seadwell

こちらも動作を確認しました。

しかし、こんなsql文はじめてみました。

またひとつ勉強になります。ありがとうございました。

2009/06/05 19:05:06
  • id:seadwell
    補足です。
    >どのようにすればいいでしょうか?
    正確には
    sql文をどのように書けばいいですか?
    です。
  • id:y-kawaz
    書いてる内に回答が閉じられてしまったようですが・・・

    やりたいことは、masterに存在するcat_idを元にcatを表示する、ということでよいでしょうか?
    >|sql|
    -- インナージョインを使った例
    SELECT DISTINCT cat.cat_id, cat.cat_name FROM master, cat WHERE master.cat_id = cat.cat_id;
    -- レフトジョインを使った例
    SELECT DISTINCT cat.cat_id, cat.cat_name FROM master LEFT OUTER JOIN cat ON master.cat_id = cat.cat_id;
    -- IN 演算子を使った例
    SELECT * FROM cat WHERE cat_id IN (SELECT cat_id FROM master);
    ||<
    前者二つは重複行を除外する為に DISTINCT を付けてます。
    検索速度はインナージョインが一番遅く、IN演算子が一番速くなるんじゃないかな、と思います。

  • id:tdoi
    festerさんの回答で気づきましたが、一番、やりたいことを直感的にあらわしているのは、次のSQLとかですかね。
    サブクエリが必要になりますので、バージョンは要確認ですが。

    SELECT
    *
    FROM
    cat
    WHERE
    cat.id IN (SELECT DISTINCT(cat_id) FROM master);
  • id:fester
    DBMSによると思いますが
    サブクエリを引数に取る場合、IN述語よりもEXISTS述語を使う
    http://www.geocities.jp/mickindex/database/db_optimize.html#LocalLink-exists
  • id:seadwell
    y-kawazさん
    申し訳ありません m(_ _)m
    2件回答を頂いたので先走り回答を閉じてしまいました。
    やりたいことはご推察の通りです。
    いくつもの回答例をコメントでご親切にありがとうございます。
    いずれも動作を確認しました。
    勉強になります。


    tdoiさん、festerさん
    少し高度すぎて話がいまいち判りませんが、お教えいただいた回答例や参考サイトを詳しくこれから見てみます。
    ありがとうございました。
  • id:tdoi
    >festerさん

    「サブクエリを引数に取る場合、IN述語よりもEXISTS述語を使う」は考えたことがなかったです。
    大変ためになりました。ありがとうございます。

  • id:dungeon-master
    蛇足ですが、

    >「サブクエリを引数に取る場合、IN述語よりもEXISTS述語を使う」
    Not IN や Not Exitsts といった応用をする場合、このことはとても重要。

    今回の「masterに存在するcat_idを元にcatを表示する」の反対、
    つまり「masterに存在しないcat_idを元にcatを表示する」をやりたい場合は、
    Not IN より、Not Exists を使った方が、大抵の場合パフォーマンスが良いのです。

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

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

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

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