2

「多くの」関係にある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をメモリにロードしたくありません。dealsordersWHERE orders.state='purchased'orderscouponsorderscoupons

これを行う方法に途方に暮れています。

4

2 に答える 2

0

相互に関連するサブクエリでこれを試して参加してください

SELECT deals.*, count(orders.id) AS orders_purchased_count 
(
SELECT  count(id) FROM coupons WHERE orders_id = orders.id 

) AS coupons_count 

FROM deals
LEFT JOIN orders ON deals.id=orders.deal_id AND orders.state='purchased'
WHERE deal_id < 3
GROUP BY deals.id
于 2013-09-27T17:05:22.500 に答える