1

我有一个包含所有产品详细信息的表名 products 和另一个包含每个仓库产品数量详细信息的 whs_products。

我想从产品表中选择 id、代码和名称以及 products.id = whs_products.product_id 的数量总和

我正在尝试这个

$this->db->select("id, code, name");
$this->db->from("products");
$this->db->join('whs_products', 'products.id = whs_products.product_id');
$this->db->select("quantity");

我得到 whs_products 中存在的列表产品而不是总和。有些产品被列出两次,因为它们在 whs_products 中有 2 个条目。

我想只列出一次所有产品,其中没有数量我想在数量上放 0 并且它在 whs_products 中大于 1 我想显示所有数量的总和

帮助将不胜感激!

表结构

Products
id, code, name, unit, price

whs_products
id, product_id, warehouse_id, quantity

我也有仓库ID、名称、地址的whs


我试过这个先生,

$this->db->select("products.id as productid, products.code, products.name, products.unit, products.cost, products.price,   sum(whs_products.quantity) as 'totalQuantity'")
->from('products')
->join('whs_products', 'whs_products.product_id=products.id', 'left')
->group_by("products.id");
$this->db->get();

一切安好。但产品总数计算错误。我认为系统将总产品数加 1,每次从 whs_products 获取数量。对于某些产品,数量是 2 或 3 次,具体取决于每个仓库。

任何解决方案。我非常感谢您的支持。

4

1 回答 1

4

请尝试以下查询和评论。

样本数据:-

产品

PID     PNAME
1   j
2   k
3   m

ws_产品展示

WID     PID     QUANTITY
11  2   300
11  2   200
14  2   500
11  1   300
15  3   100
14  3   800

查询以按 pid in 获取总数whs_products

select pid, wid, sum(quantity) 
from whs_products
group by pid, wid
;

结果:

PID     WID     SUM(QUANTITY)
1       11      300
2       11      500
2       14      500
3       14      800
3       15      100

使用变量进行查询以获取pidpid、wid 的用户输入

-- group by pid and wid
set @var:='2'
;
select a.pid, b.pname, a.wid, sum(a.quantity) 
from whs_products a
join products b
on b.pid = a.pid
where a.pid = @var
group by a.pid, wid
;

结果:

PID     PNAME   WID     SUM(A.QUANTITY)
2       k   11  500
2       k   14  500

最终查询仅通过用户输入 pid 显示数量

询问:

-- by pid only    
set @var:='2'
;
select a.pid, b.pname, sum(a.quantity) 
from whs_products a
join products b
on b.pid = a.pid
where a.pid = @var
group by a.pid
;

结果:

PID     PNAME   SUM(A.QUANTITY)
2       k   1000

由于 OP 想要在 CodeIgniter

这是您尝试的先机。起初我的印象是您已经知道 SQL 的语法codeigniter并且正在寻找 SQL 逻辑,因此您可以将其转换为所需的格式。

$this->db->select("a.pid, b.pname, count(a.quantity) as 'toalQuantity'");
$this->db->from('wsh_products a');
$this->db->join('products b', 'a.pid=b.pid', 'inner');
$this->db->group_by("a.pid"); 
$where = "a.pid = 2";
$this->db->get();
$query->results_array();

或者写一个函数:):

function getQuantity($prodid = false)
{
  $this->db->select(a.pid, b.pname, count(a.quantity) as 'toalQuantity');
  $this->db->join('wsh_products a', 'a.pid=b.pid');
  if ($prodid !== false)
    $this->db->where('a.pid', $prodid);
  $query = $this->db->get('products b');

  if($query->result() == TRUE)
  {
    foreach($query->result_array() as $row)
    {
      $result[] = $row;
    }
    return $result;
  }
}

LEFT JOIN按照评论中要求的 OP 进行编辑

要在 Products 表中显示所有产品,请执行以下操作:

  • 在表中select显示。pidProducts

  • 采用from Products Left Join Whs_Products

  • Group by pidProducts

于 2012-12-26T10:28:18.380 回答