中間テーブルで多対多を表現する
多対多の関係とは?
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・商品名・数量・単価を取得してください