Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql-从一个表中的两组记录中获取总数_Mysql_Sql - Fatal编程技术网

MySql-从一个表中的两组记录中获取总数

MySql-从一个表中的两组记录中获取总数,mysql,sql,Mysql,Sql,我使用的是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) D

我使用的是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吗?

您需要在加入此SQL之前聚合信息。因为您有两个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

您需要在加入信息之前对其进行聚合。因为您有两个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

谢谢你的快速回复。我的用例是这样的,我需要一个产品记录形式的结果集,总和作为记录中的列。问题是用例的简化版本。“有没有办法做到这一点?”苏里亚:我意识到,一旦我回答了这个问题。使用MySQL这样做相当乏味,但它是可行的。请查看更新的答案。感谢您的快速回复。我的用例是这样的,我需要一个产品记录形式的结果集,总和作为记录中的列。问题是用例的简化版本。“有没有办法做到这一点?”苏里亚:我意识到,一旦我回答了这个问题。使用MySQL这样做相当乏味,但它是可行的。请查看更新的答案。