SQLLearn
← レッスン一覧/中級

中間テーブルで多対多を表現する

多対多の関係とは?

1つの注文には複数の商品が含まれ、1つの商品は複数の注文に含まれます。このような多対多(N:M)の関係は、直接テーブルを結びつけることができません。

中間テーブルで解決する

中間テーブル(または関連テーブル)を間に挟むことで多対多を表現します。

orders ─── order_products ─── products
  1件の注文   N件の明細    1種の商品
(1)       (多対多)       (1)

order_products の構造

order_products
  id          — 明細ID
  order_id    — どの注文か(ordersのid)
  product_id  — どの商品か(productsのid)
  quantity    — 数量
  price       — 単価

3テーブルを結合して読み解く

SELECT
  u.name AS ユーザー,
  p.name AS 商品,
  op.quantity AS 数量,
  op.price * op.quantity AS 小計
FROM orders o
JOIN users u          ON o.user_id = u.id
JOIN order_products op ON o.id = op.order_id
JOIN products p       ON op.product_id = p.id;

集計への応用

SELECT u.name, SUM(op.price * op.quantity) AS 合計金額
FROM orders o
JOIN users u          ON o.user_id = u.id
JOIN order_products op ON o.id = op.order_id
GROUP BY u.name
ORDER BY 合計金額 DESC;
サブクエリ

練習問題

問題 1

orders・order_products・productsを結合して、注文ID・商品名・数量・単価を取得してください

SQL エディタ