2

この状況を理解するには、ちょっとした助けが必要です。codeigniter が UNION をサポートしていないことがわかりました。この方法を見つけて、同じ id の製品を持つ 2 つのテーブルの合計を取得したいと考えています。

問題は、合計 2 テーブルでは、値が重複または乗算されることです。

SQL フィドルへのリンク

構造 :

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

どんな助けでも大歓迎です。

4

2 に答える 2

3

あなたの問題は、デカルト積を作成して、重複した合計を取得することです。たとえば、製品 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

幸運を。

于 2013-02-09T20:00:40.003 に答える
0

必要な回答を得る最善の方法がユニオン クエリを使用することであり、codeigniter でユニオン クエリを作成できない場合は、codeigniter を使用してクエリを作成しないでください。ストアド プロシージャに入れ、codeigniter でストアド プロシージャを呼び出します。

于 2013-02-09T21:02:28.410 に答える