我有一个“有很多”关系的一套MySQL的三个表:交易,订单和优惠券。Mysql的嵌套左加入与计数
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 |
|----|--------------|------------------------|---------------|
的棘手的事情,在我的情况,将是deals
选择之前,我参加在orders
和orders
选择之前,我对coupons
加入何时运行WHERE orders.state='purchased'
过滤器时运行WHERE deal_id < 3
过滤器。这是一个大的数据集,我不希望我的所有orders
和coupons
加载到内存中用于连接的目的。
在如何做到这一点的损失。
是否有sqlfiddle? – Strawberry