【问题标题】:MySQL query to count user orders by typeMySQL查询按类型计算用户订单
【发布时间】:2017-12-14 02:08:13
【问题描述】:

我有这 3 个表:users、orders 和 order_item。

当用户可以有订单时,订单项目可以是仅事件、仅会员或两者兼而有之,因此将 2 行写入 order_items

用户表

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的用户

提前致谢,

【问题讨论】:

  • 你的表有no关系
  • 你所寻求的称为pivoting

标签: mysql


【解决方案1】:

使用一些条件聚合可以得到预期的结果集

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

【讨论】:

    【解决方案2】:

    您的查询需要连接三个表的公共字段,即 user_id 和 order_id。

    由于您说您不想要任何成员资格不是订单类型的结果,因此您的结果示例没有意义,并且使用单个 mysql 查询以这种方式分组为单个结果使得放置 order_type 的事情变得复杂一个字段分成两个单独的列。所以我稍微调整了一下。

    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 终端的工作输出:

    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 | +---------+------+------------+--------------+

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多