MySql-从一个表中的两组记录中获取总数
我使用的是Mysql版本5.5。我有两张桌子——产品,订单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
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这样做相当乏味,但它是可行的。请查看更新的答案。