我正在使用数据库在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,而在其他表中则不是。
答案 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 INSERT
和B
上使用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;
然后您只需在B
和C
INSERT INTO B VALUES ('blue', 5);
INSERT INTO C VALUES ('blue', 10);
和触发器在表Y
中维护A
值。
这是 SQLFiddle 演示