Entries


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

mysql:テーブルをJOIN結合するときに複数のキーを指定してみた


データーベースでテーブルをJOINするときに複数のキーを指定したいと考えました.もともとはaccessをいじっていたところ取得結果がうまくいかないというバグがありまして,調べてみるとプライマリーキー一つのみでJOINしていることが問題でした.実際にはキーを二つ結合しないとまずかったのです.

いままで二つキーを使ってテーブルをJOINした経験がなかったのでやり方がわかりません.まずは練習用のテーブルを作ってみます.今回の例ではメインのテーブルmainsとサブテーブルsubsをJOINします.
mysql> desc mains;
+-------+----------+------+-----+---------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------------------+-------+
| id | int(11) | NO | PRI | 0 | |
| mid | int(11) | NO | PRI | 0 | |
| exp | text | YES | | NULL | |
| date | datetime | NO | PRI | 0000-00-00 00:00:00 | |
+-------+----------+------+-----+---------------------+-------+
4 rows in set (0.00 sec)

mysql> desc subs;
+-----------+-----------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------+------+-----+-------------------+-------+
| id | int(11) | NO | PRI | 0 | |
| mid | int(11) | NO | PRI | 0 | |
| param | int(11) | YES | | NULL | |
| timestamp | timestamp | NO | | CURRENT_TIMESTAMP | |
+-----------+-----------+------+-----+-------------------+-------+
4 rows in set (0.00 sec)

この二つのテーブルはそれぞれidとmidというカラムを持ち,それぞれがプライマリーキーになっています.もちろん二つのテーブルのidとmidは関連付けがされているものとします.

最初にidカラムでJOINさせたsql次にidとmidを使ったものを書いてみます.


いままでUSINGなんて便利なものがあるとは知りませんでした.
参考までにいろいろSELET文を流してみたので貼ってみます.しかしmysqlのドキュメントは詳しくていいですね.


mysql> SELECT mains.exp,subs.param FROM mains INNER JOIN subs on mains.id = subs.id AND mains.mid = subs.mid ;
+------+-------+
| exp | param |
+------+-------+
| aaa | 1 |
| bbb | 1 |
| ccc | 4 |
| ddd | 4 |
+------+-------+
4 rows in set (0.00 sec)

mysql>
mysql> SELECT mains.exp,subs.param FROM mains INNER JOIN subs USING (id,mid) ;
+------+-------+
| exp | param |
+------+-------+
| aaa | 1 |
| bbb | 1 |
| ccc | 4 |
| ddd | 4 |
+------+-------+
4 rows in set (0.00 sec)

mysql>
mysql> SELECT mains.exp,subs.param FROM mains INNER JOIN subs on mains.mid = subs.mid ;
+------+-------+
| exp | param |
+------+-------+
| aaa | 1 |
| aaa | 4 |
| aaa | 2 |
| bbb | 1 |
| bbb | 4 |
| bbb | 2 |
| ccc | 1 |
| ccc | 4 |
| ccc | 2 |
| ddd | 1 |
| ddd | 4 |
| ddd | 2 |
+------+-------+
12 rows in set (0.00 sec)

テストテーブルではmidだけでJOINするとうまく結果が出ませんでした.

ぷぎえもんの場合,accessでGroup BYとかHaving SUMとかで値をまとめていたのでJOINの結合ミスにきづくまで時間がかかってしまいました.sqlが長くなるとわかりにくくなるのはなんとかならないものですかね.

Head First SQL 頭とからだで覚えるSQLの基本Head First SQL 頭とからだで覚えるSQLの基本
(2008/06/09)
Lynn Beighley

商品詳細を見る


Appendix

プロフィール

川崎修

  • Author:川崎修
  • インターネット大好き!
    調布周辺で自宅警備してます



    メール:pugiemonn@gmail.com
    skype:pugiemonn
    twilog:Twilog
    mixi:mixi
    facebook:facebook
My Profile by iddy
FC2ブログ

カレンダー

06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

最近の記事

Twitter

コミュニティ

ブログ内検索

ブロとも申請フォーム

この人とブロともになる

Adsense

月別アーカイブ

はてぶ数

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。