テーブルをつなぐ

INPUT · スライド

会員の表を足す

01 / 04

買った人の表

orders に残っていた番号がもう1つあったよね。member_id だよ。

これは members テーブルの id を指している。会員1人が1レコードだよ。

  • id … 会員の番号
  • name … 会員の名前
  • city … 住んでいる町
SELECT * FROM members;

実行結果

1 | みなと | あおば市
2 | すずな | ひなた町
3 | かえで | あおば市
4 | いつき | みずうみ市
5 | ののか | ひなた町

02 / 04

3つの表の見取り図

これで表が3つそろった。関係を言葉にするとこうなるよ。

  • orders.item_iditems.id を指す
  • orders.member_idmembers.id を指す
  • itemsmembers は直接つながっていない

orders が真ん中にいて、両側の表を橋わたししている形だね。「何を」「だれが」を注文の表が持っているんだ。

SELECT id, item_id, member_id  FROM orders  LIMIT 3;

実行結果

1 | 1 | 1
2 | 3 | 2
3 | 2 | 1

03 / 04

会員名でつないでみる

つなぎ方は items のときと同じ。ON に書く鍵を orders.member_id = members.id に変えるだけだよ。

注文と会員が対応づいて、だれが何個買ったかが名前で読めるようになった。

SELECT members.name, orders.quantity  FROM orders  JOIN members  ON orders.member_id = members.id;

実行結果

みなと | 2
すずな | 4
みなと | 4
かえで | 1
いつき | 3
かえで | 2
いつき | 2
すずな | 3
みなと | 6

04 / 04

`name` がぶつかる

ここで気をつけたいのが、items にも members にも name という列があること。

2つだけつなぐうちは name と書いても通ってしまうけれど、3つつなぐと「どっちの name か分からない」とエラーになる。はじめから members.name と書く癖をつけておこう。

SELECT members.name,  SUM(orders.quantity) AS total  FROM orders  JOIN members  ON orders.member_id = members.id  GROUP BY members.name  ORDER BY total DESC;

実行結果

みなと | 12
すずな | 7
いつき | 5
かえで | 3