【问题标题】:Issue on sum table total sql codeigniter关于总和表总 sql codeigniter 的问题
【发布时间】:2013-02-08 17:20:51
【问题描述】:

当我想按 id 计算列的总和时,我遇到了一个小问题。

餐桌用品

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

为什么要取 x 2 的结果?

感谢任何帮助。

【问题讨论】:

标签: sql codeigniter


【解决方案1】:

因为您通过您的项目主数据(产品表)将采购活动加入到销售活动中。因此,总和中包含的购买行数取决于您拥有的销售行数;反之亦然。

您需要将这些查询分隔为单独的 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 模型中有什么,但在您修改后的查询中,您将 SQL 语句分配给变量 $products 两次但不执行语句?

还要确保您的警报模型扩展 CI_Model

在更标准的 Codeigniter 语法中,我会这样做:

    // 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.

【讨论】:

  • 我明白,所以,没有办法从 2 个不同的表中获取 codeigniter 的总和。我正在使用 echo $this->alerts->generate();用于服务器端数据表。这种方式不知道怎么构建。
  • 你可以通过运行两个 Active Record 查询得到你想要的,然后在你的视图中组合结果。
  • 我已经更新了问题,现在的问题是我无法得到最终结果,因为我在调用成员 result_array() 时遇到致命错误
  • @Dario 查看更新后的建议。顺便说一句,通常你需要GROUP ON 所有未聚合(求和)的列,所以我包括了这些。但是,如果您的价格发生变化,您的价格列会导致出现额外的行。
猜你喜欢
  • 2021-01-22
  • 2018-06-05
  • 1970-01-01
  • 2016-01-23
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多