我想将b表中的值添加到a并将值从c减去a

时间:2013-08-04 02:43:09

标签: php

我正在使用数据库在php中开发库存页面,如下所述。我有一些复杂的等式,我无法解决。请帮帮我。

我有一个表名“A”,列X和Y的值如下:

表“A”

------------
X        Y
------------
blue     0
yellow   0
brown    0

以下模式表“B”。

------------
X        Y
------------
blue    50
yellow  15
blue    20
brown    5

类似表“C”

------------
X        Y
------------
blue    15
yellow  10
blue     5
brown    5 

现在我想要的是如果我在上面提到的表“B”中添加记录,它应该在表“A”中用以下等式更新。

"A"= "B"-"C"

结果应该是,

表“A”

------------
X        Y
------------
blue    20
yellow   5
brown    0

在添加记录表的情况下相同“C”等式应如下:

请注意表“A”中的X值是DISTINCT,而在其他表中则不是。

2 个答案:

答案 0 :(得分:0)

$results = array();

// Sum all from B
foreach ($db->query('SELECT * FROM B')->fetchAll() as $row)
{
    $results[$row['X']] += $row['Y'];
}

// Substract all from C
foreach ($db->query('SELECT * FROM C')->fetchAll() as $row)
{
    $results[$row['X']] -= $row['Y'];
}

// Insert result into A
foreach ($results as $X => $Y)
{
    $db->query("INSERT INTO A (X, Y) VALUES ('$X', '$Y')");
}

这假定您已创建名为$db的PDO对象。如果您使用的是其他数据库扩展,请调整它。

答案 1 :(得分:0)

可能的解决方案是在表AFTER INSERTB上使用C触发器

CREATE TRIGGER tg_b_after_insert
AFTER INSERT ON b
FOR EACH ROW
  UPDATE a 
     SET y = 
  (
    SELECT 
    (
      SELECT SUM(y) 
        FROM B
       WHERE x = NEW.x
    ) -
    (
      SELECT SUM(y) 
        FROM C
       WHERE x = NEW.x
    )
  )
   WHERE x = NEW.x;

CREATE TRIGGER tg_c_after_insert
AFTER INSERT ON c
FOR EACH ROW
  UPDATE a 
     SET y = 
  (
    SELECT 
    (
      SELECT SUM(y) 
        FROM B
       WHERE x = NEW.x
    ) -
    (
      SELECT SUM(y) 
        FROM C
       WHERE x = NEW.x
    )
  )
   WHERE x = NEW.x;

然后您只需在BC

中插入新行
INSERT INTO B VALUES ('blue', 5);
INSERT INTO C VALUES ('blue', 10);

和触发器在表Y中维护A值。

这是 SQLFiddle 演示