【问题标题】:Sum more than 1 table from SQL on codeigniter在 codeigniter 上从 SQL 汇总超过 1 个表
【发布时间】:2013-02-09 19:11:53
【问题描述】:

需要一点帮助来弄清楚这种情况。 我看到 codeigniter 不支持 UNION,我想找出这个方法来获得 2 个表的总和,产品 id 相同。

问题在于 sum 2 表中的值是重复的或相乘的。

链接到SQL Fiddle

结构:

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;

Codeigniter 函数:

$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();

非常感谢任何帮助。

【问题讨论】:

  • 你已经问过这个question
  • 你好 Wolf,是的,但我在这里询问如何在不使用联合的 codeigniter 中获取正常的 sql,并询问为什么值是 X。没有冒犯。你给我最好的回应。但仍在寻找解决方案。

标签: php sql codeigniter


【解决方案1】:

您的问题是您产生了笛卡尔积,因此得到了重复的总和。以产品 ID 3 为例。您将其与 p_items prid = 3 相关联。它本身将返回 200。但是,一旦您加入 s_items prid = 3,现在对于 s_items 中的每一行,它必须与 p_items 中的每一行匹配。含义:

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_items,则需要从 s_items 获取第 13 行。同样,如果您使用 s_items,您将不会从 p_items 获得第 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:http://sqlfiddle.com/#!2/62b45/12

祝你好运。

【讨论】:

  • ThAnks Sr sgeddes。主表是产品。我用 p_items 制作了 sql。但通常需要是产品,因为具有唯一的 ID。并且 p_items 和 s_items 具有购买的数量和出售的数量。
  • 可以作为一个选项» 有 p_items.prid = products.id 吗?还是在哪里?谢谢
【解决方案2】:

如果获得所需答案的最佳方法是使用联合查询,而 codeigniter 不允许您编写查询,请不要使用 codeigniter 来编写查询。放到一个存储过程中,用codeigniter调用这个存储过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多