【问题标题】:MySql - Getting total number from two groups of records from one table [duplicate]MySql - 从一张表的两组记录中获取总数[重复]
【发布时间】:2017-11-18 08:02:19
【问题描述】:

我使用的是 Mysql 5.5 版。我有两个表 - 产品,订单。

CREATE TABLE `product` (
  `id` int(11) NOT NULL,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `ordr` (
  `id` int(11) NOT NULL,
  `product_id` varchar(45) DEFAULT NULL,
  `status` varchar(45) DEFAULT NULL,
  `qty` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是它们的填充方式 -

insert into product values (20, 'pen');

insert into ordr values (100, 20, 'queue', 5);
insert into ordr values (110, 20, 'queue', 5);
insert into ordr values (120, 20, 'pending', 10);
insert into ordr values (130, 20, 'pending', 10);
insert into ordr values (140, 20, 'pending', 10);

我想获取处于两种不同状态的产品的总数。对于上面数据的测试数据,我希望看到队列数量为 10,待处理数量为 30。

当我跑步时

select p.name, sum(o.qty) as queue_qty, sum(o2.qty) as pending_qty
from product p
left outer join ordr o on o.product_id = p.id and o.status = 'queue'
left outer join ordr o2 on o2.product_id = p.id and o2.status = 'pending'
where p.id = 20;

我明白了

name - pen
queue_qty - 30
pending_qty - 60

有人可以帮我修复这个 SQL 吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您需要在加入之前汇总信息。由于您有两个 1-n 关系,因此您的连接逻辑是重复信息。

    select
      p.name
      , o.qty as qty_queue
      , o2.qty as qty_pending
    from
      product p
      join (
        select
          product_id
          , sum(qty) as qty
        from
          ordr
        where
          ordr.status = 'queue'
        group by
          product_id
      ) o
        on p.id = o.product_id
      join (
        select
          product_id
          , sum(qty) as qty
        from
          ordr
        where
          ordr.status = 'pending'
        group by
          product_id
      ) o2
        on p.id = o2.product_id
    group by
      p.name
    

    【讨论】:

    • 感谢您的快速回复。我的用例是这样的,我需要一个产品记录形式的结果集,总和作为记录中的列。问题是用例的简化版本。有没有办法做到这一点?
    • @Surya:一旦我回答了,我就意识到了。使用 MySQL 这样做相当乏味,但它是可行的。请查看更新后的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多