0

列の合計を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

関数codeigniter:

$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

なぜ結果をx2にするのですか?

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

4

1 に答える 1

0

アイテムマスター(製品テーブル)を介して購買活動を販売活動に参加させているためです。結果として、合計に含まれる購入の行数は、販売の行数によって異なります。販売の場合はその逆です。

これらのクエリは、ビューで組み合わせる個別のSQLステートメントとして分離する必要があります。または、SQLを使用UNION ALLして2つのステートメントを組み合わせることができます。1つは購入用、もう1つは販売用です。

2つのステートメント:

$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ステートメントを変数に2回割り当てています$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.
于 2013-02-08T18:26:21.727 に答える