2017-12-13 13 views
0

私はこの3つのテーブルを持っています:ユーザー、注文、およびorder_item。ユーザが注文を持つことができ、注文アイテムは、イベントのみ、会員のみ、または両方であり得る、およびSO 2行はORDER_ITEMSにタイプ別にユーザーの注文をカウントするMySQLのクエリ

ユーザテーブル

id | user_id | name | phone 
---|-----------|-------|------ 
1 | 123456789 | Jon | 555-55555 
2 | 123456780 | Alice | 555-6666 

注文書き込まれる

テーブル

id | user_id | user_uid | user_info 
---|---------|-----------|---------- 
1 | 1  | 123456789 | bla 
2 | 2  | 123456780 | foo 
3 | 2  | 123456780 | foo 

ORDER_ITEMS表

id | order_id | order_type | price 
--- | -------- | ---------- | ------ 
1 | 1  | membership | 70 
2 | 1  | event  | 200 
3 | 2  | event  | 300 
4 | 3  | membership | 70 

関係が

order_items.order_id -> orders.id 
orders.user_id -> users.id 
orders.user_uid -> users.user_id 

私はこのタイプの出力を生成しますクエリを探しています、

user_id | name | count_membership | count_events | total_orders 
-------- | ------ | ------------------ | -------------- | -------------- 
123456789 | Jon | 1     | 1    | 1 
123456780 | Alice | 1     | 1    | 2 

私は、ユーザーが持っている総受注数をカウントしたい、そして、このようなものです彼が持っている品物の数を数えます。私は事前にcount_membership = 0

おかげで、すべてのユーザーをフィルタしたい最後に、

+0

を使用して設定予想される結果を得ることができますblesは* no *の関係を持っています – Tomm

+0

あなたが求めているものは、pivoting *と呼ばれています。 –

答えて

1

あなたはあなたのTAいくつかの条件付き集約

select u.user_id, 
u.name, 
sum(oi.membership_count) membership_count, 
sum(oi.event_count) event_count, 
count(o.id) total_orders 
from users u 
join orders o on u.id = o.user_id 
join (
    select order_id, 
    sum(order_type = 'membership') membership_count, 
    sum(order_type = 'event') event_count 
    from order_items 
    group by order_id 
) oi on o.id = oi.order_id 
group by u.user_id,u.name 

Demo

1

あなたのクエリがUSER_IDとORDER_IDされるだろう彼らの共通フィールド、上の3つのテーブルを結合する必要があります。

メンバーシップが注文タイプでない場合の結果を望んでいないと言ったので、結果の例は意味をなさないので、1つのmysqlクエリを使用して単一の結果にグループ化すると、order_type 2つの別々の列になっている単一のフィールドです。だから少し調整しました。

mysqlの端子からの出力を作業

select users.user_id, users.name, order_type, count(order_id) as total_orders from orders, order_items, users where users.user_id = orders.user_id and orders.id = order_items.order_id and order_type = "membership" group by users.user_id, users.name

mysql> select users.user_id, users.name, order_type, count(order_id) as total_orders from orders, order_items, users where users.user_id = orders.user_id and orders.id = order_items.order_id and order_type = "membership" group by users.user_id, users.name; +---------+------+------------+--------------+ | user_id | name | order_type | total_orders | +---------+------+------------+--------------+ | 123 | Jon | membership | 1 | | 1234 | Pam | membership | 2 | +---------+------+------------+--------------+

関連する問題