「多くの」関係にあるMySQL 3つのテーブルのセットがあります。取引、注文、クーポンです。
Deals
|----|--------------|
| id | title |
|----|--------------|
| 1 | Some deal |
| 2 | Another deal |
|----|--------------|
Orders
|----|---------|-----------|
| id | deal_id | state |
|----|---------|-----------|
| 1 | 1 | purchased |
| 2 | 1 | purchased |
| 3 | 1 | expired |
| 4 | 2 | purchased |
|----|---------|-----------|
Coupons
|----|----------|
| id | order_id |
|----|----------|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 4 |
|----|----------|
そのため、取引には多くの注文があり、多くのクーポンがあります。
やりたいことは、購入した注文とクーポンの数を数えながら、取引テーブルで選択することです。
支払い済みの注文をカウントする方法はすでに知っています。
SELECT deals.*, count(orders.id) AS orders_purchased_count FROM deals
LEFT JOIN orders ON deals.id=orders.deal_id AND orders.state='purchased'
WHERE deal_id < 3
GROUP BY deals.id
Deals
|----|--------------|------------------------|
| id | title | orders_purchased_count |
|----|--------------|------------------------|
| 1 | Some deal | 2 |
| 2 | Another deal | 1 |
|----|--------------|------------------------|
同様に、注文のクーポンの数を取得できます。
SELECT orders.*, count(coupons.id) AS coupons_count FROM orders
LEFT JOIN coupons ON orders.id=couoons.orders_id
WHERE orders.state='purchased'
GROUP BY orders.id
Orders
|----|-----------|---------------|
| id | state | coupons_count |
|----|-----------|---------------|
| 1 | purchased | 3 |
| 2 | purchased | 2 |
| 4 | purchased | 1 |
|----|-----------|---------------|
私の質問は次のとおりです。これらをどのように組み合わせて、orders_purchased_count の横に Coupons_count を追加できるようにしますか?
Deals
|----|--------------|------------------------|---------------|
| id | title | orders_purchased_count | coupons_count |
|----|--------------|------------------------|---------------|
| 1 | Some deal | 2 | 5 |
| 2 | Another deal | 1 | 1 |
|----|--------------|------------------------|---------------|
私の場合、トリッキーなことは、参加する前にWHERE deal_id < 3
から選択するときにフィルターを実行し、参加する前に選択するときにフィルターを実行することです。これは大規模なデータセットであり、参加する目的ですべてのandをメモリにロードしたくありません。deals
orders
WHERE orders.state='purchased'
orders
coupons
orders
coupons
これを行う方法に途方に暮れています。