2013-02-08 31 views
0

当我想通过id使列的总和有一点问题。发表总计sql codeigniter

表产品

id code name  price quantity 
522 123  Product 1  12  4 

表purchase_items

id product_id quantity 
1  522   5 
2  522   1 

表sale_items

id product_id quantity 
1  522   1 
2  522   1 

功能笨:

$products = $this->alerts->select('products.id as productid, products.code as code, products.name, products.price, sum(sale_items.quantity)') 
     ->from('products'); 
     $this->alerts->join('sale_items', 'products.id = sale_items.product_id');   
     $this->alerts->group_by("products.id"); 

     $products = $this->alerts->select('products.id as productid, products.code as code, products.name, products.price, sum(purchase_items.quantity)') 
     ->from('products'); 
     $this->alerts->join('purchase_items', 'products.id = purchase_items.product_id');   
     $this->alerts->group_by("products.id"); 


     $this->alerts->unset_column('productid'); 

     foreach ($this->result_array() as $product) 
     { 
      $products[] = $product['record']; 
     } 

     return $products; 
    } 

的问题是,对于

purchase_items the result is 12 
sale_items  the result is 4 

结果为什么走的是结果×2?

任何帮助表示赞赏。

+0

我认为[我回答这个问题(http://stackoverflow.com/questions/13651446/multiple-left-joins如何/ 13652061#13652061)应该告诉你为什么...这是因为你没有考虑组合套件,基本上我知道 – 2013-02-08 18:10:17

回答

0

因为您正在通过商品主数据(产品表)将采购活动加入到销售活动中。因此,总额中包含的采购行数取决于您有多少行销售额;反之亦然。

您需要将这些查询分开为您在视图中组合的单独SQL语句,也可以使用SQL UNION ALL合并两个语句:一个用于购买,一个用于销售。

两个语句:

$this->alerts 
      ->select('products.id as productid, products.code as code, products.name, products.price, sum(purchase_items.quantity)') 
      ->from('products'); 
      $this->alerts->join('purchase_items', 'products.id = purchase_items.product_id'); 
       $this->alerts->group_by("products.id"); 
      echo "Total Purchases"; 
      echo $this->alerts->generate(); 


$this->alerts 
      ->select('products.id as productid, products.code as code, products.name, products.price, sum(sale_items.quantity)') 
      ->from('products'); 
      $this->alerts->join('sale_items', 'products.id = sale_items.product_id');   
       $this->alerts->group_by("products.id"); 
      echo "Total Sales"; 
      echo $this->alerts->generate(); 

或者,在SQL:

$results = $this->db->query(' 
    SELECT products.id as productid, products.code as code, products.name, products.price, ''Purchase'' as transaction, sum(purchase_items.quantity) 
    FROM products 
    JOIN purchase_items ON products.id = purchase_items.product_id 
    GROUP BY products.id 
    UNION ALL 
    SELECT products.id as productid, products.code as code, products.name, products.price, ''Sale'' as transaction sum(sales_items.quantity) 
    FROM products 
    JOIN sales_items ON products.id = sales_items.product_id 
    GROUP BY products.id')->result_array(); 

// Echo $results.... 

编辑: 我不完全知道你在你的Alerts模式,但在你修改查询您正在向变量$products分配两次SQL语句但不执行语句?

此外,请确保您的警报模型延伸CI_Model

更笨的标准语法,我会做这样的事情:

// In Controller, assuming the Alerts model is loaded, and using method chaining. 

    // Get all sales. By the way, you normally have to group on all columns *not* being aggregated. You might 
    // get unexpected results by grouping on price, unless the price never changes. 
    $this->alerts->select('products.id as productid, products.code, products.name, products.price, sum(sale_items.quantity) as quantity') 
      ->from('products') 
      ->join('sale_items', 'products.id = sale_items.product_id') 
      ->group_by('products.id, products.code, products.name, products.price'); 
    $sales = $this->alerts->get()->result_array(); 

    // Get all purchases 
    $this->alerts->select('products.id as productid, products.code, products.name, products.price, sum(purchase_items.quantity) as quantity') 
      ->from('products') 
      ->join('purchase_items', 'products.id = purchase_items.product_id') 
      ->group_by(products.id, products.code, products.name, products.price); 
    $purchases = $this->alerts->get()->result_array(); 

    // Put it all together 
    $products = array_merge($sales, $purchases); 

    // And now do something with your combined results $products. Send to view, echo etc. 
+0

,所以,没办法从2个不同的表格中获得codeigniter的总和。即时通讯使用echo $ this-> alerts-> generate();用于服务器数据表。不知道如何在这种方式构建。 – Dario 2013-02-08 19:43:36

+0

通过运行两个活动记录查询,然后在视图中合并结果,可以获得所需的结果。 – Wolf 2013-02-08 21:01:51

+0

我已经更新了这个问题,现在的问题是我无法得到最终结果,因为即时通讯成为致命错误result_array() – Dario 2013-02-08 23:26:52