0

我正在使用数据库在 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,而在其他表中则不是。

4

2 回答 2

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')");
}

这假定您已经创建了一个名为 的 PDO 对象$db。如果您使用不同的数据库扩展,请对其进行调整。

于 2013-08-04T04:45:59.993 回答
0

一个可能的解决方案是在表上使用AFTER INSERT触发器BC

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演示

于 2013-08-04T04:54:35.343 回答