Php 对codeigniter上的SQL中的多个表求和

Php 对codeigniter上的SQL中的多个表求和,php,sql,codeigniter,Php,Sql,Codeigniter,需要一点帮助来解决这个问题。 我看到codeigniter不支持UNION,我想找出这个方法来获得两个表的总和,具有相同的乘积id 问题是在sum 2表上,值是重复的或乘法的 链接到 结构: create table products (id int, name varchar(9)); insert into products (id, name) values (1,'Product 1'), (2,'Product 2'), (3,'Product 3'); create table

需要一点帮助来解决这个问题。 我看到codeigniter不支持UNION,我想找出这个方法来获得两个表的总和,具有相同的乘积id

问题是在sum 2表上,值是重复的或乘法的

链接到

结构:

create table products
(id int, name varchar(9));
insert into products 
(id, name)
values
(1,'Product 1'),
(2,'Product 2'),
(3,'Product 3');


create table p_items
(puid int, prid int, quantity int);
insert into p_items
(puid, prid, quantity)
values
(11,1,100),
(11,2,100),
(11,2,100),
(14,2,100),
(14,3,100),
(15,3,100);

create table s_items
(puid int, prid int, quantity int);
insert into s_items
(puid, prid, quantity)
values
(11,1,1),
(11,2,1),
(11,2,1),
(13,2,1),
(15,3,1),
(13,3,1);
在普通SQL中执行:

select a.puid, b.name, a.prid, sum(a.quantity) as P_ITEMS, sum(c.quantity) as S_ITEMS
from p_items a
join products b
on b.id = a.prid
join s_items c
on c.prid = a.prid
group by a.prid;
代码点火器功能:

$this->alerts
            ->select('products.id as productid, products.name, sumt(p_items.quantity), sum(s_items.quantity)', FALSE)
            ->from('products')
            ->join('p_items', 'products.id = p_items.prid', 'left')
            ->join('s_items', 'products.id = s_items.prid')
            ->group_by("products.id");
            echo $this->alerts->generate();

非常感谢您的帮助。

您的问题是生成笛卡尔积,从而得到重复的和。以产品ID 3为例。您将其与p_项prid=3相关联。就其本身而言,这将使您返回200。但是,一旦您加入s_项目prid=3,现在对于s_项目中的每一行,它必须与p_项目中的每一行匹配。意思是:

14 3 100 15 3 1
14 3 100 15 3 1
15 3 100 15 3 1
15 3 100 15 3 1
---------------
     400      4
除了产品表之外,哪个表是您的主表?如果使用p_项,则需要从s_项获取第13行。同样,如果使用s_项,则不会从p_项中获得第14行

可以使用子查询完成此操作:

select b.id, 
  b.name, 
  P_ITEMS, 
  S_ITEMS
from products b
  left join 
    (SELECT prid, SUM(quantity) as P_Items
     FROM p_items
     GROUP BY prid)
     a on b.id = a.prid
  left join 
    (SELECT prid, SUM(quantity) as S_Items
     FROM s_items
     GROUP BY prid)
     c on c.prid = a.prid
group by b.id, b.name
以及更新的Fiddel:


祝你好运。

如果获得你想要的答案的最好方法是使用联合查询,而codeigniter不允许你编写,那么不要使用codeigniter编写你的查询。将其放入存储过程中,并使用codeigniter调用存储过程。

谢谢Sr sgeddes。主表是产品。我用p_项创建了sql。但是,因为p_项目和s_项目具有唯一的id,所以Normal必须是产品。p_项目和s_项目具有购买的数量和出售的数量。是否可以作为选项?p_项目。prid=products.id?或者在哪里?谢谢你已经问过这个Hello Wolf了,是的,但这里我问的是如何在codeigniter中获得不使用union的普通sql,并问为什么值是X。没有冒犯。你给了我最好的答复。但仍在寻找解决方案。