3张桌子(账单,物品,付款);从父表中获取项目和付款的总和以及日期

时间:2016-03-02 15:40:58

标签: php mysql

我有三张桌子:

票据
bill_id(主要/唯一)
创建(日期)


item_id(主要/唯一)
bill_id(外国)
总(十进制)

付款
payment_id(主要/唯一)
bill_id(外国)
金额(十进制)

基本上,在创建“帐单”后,我可以将项目附加到其中,然后再附加付款。

我想要解决的问题是获取共享相同外来(bill_id)键的 amount 列的SUM,例如:

我已经设法获得了一些不错的东西,但是它并没有组合共享相同外键的列的SUM;如果没有让值增加自己,我似乎无法弄明白......

SELECT DISTINCT
b.bill_id,
b.created,
i.total,
p.amount
FROM items i
LEFT JOIN bills b
ON b.bill_id = i.bill_id
LEFT JOIN payments p
ON B.bill_id = p.bill_id

e.g:

谢谢!

编辑:我还不知道如何使用SQL Fiddle。

CREATE TABLE bills (
    bill_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
    created DATE NOT NULL,
    PRIMARY KEY (bill_id)
) ENGINE = INNODB;

CREATE TABLE items (
    item_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
    bill_id MEDIUMINT UNSIGNED NOT NULL,
    total DECIMAL(38,2) UNSIGNED,
    PRIMARY KEY (item_id),
    FOREIGN KEY (bill_id) REFERENCES bills (bill_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = INNODB;

CREATE TABLE payments (
    payment_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
    bill_id MEDIUMINT UNSIGNED NOT NULL,
    amount DECIMAL(38,2) UNSIGNED,
    PRIMARY KEY (payment_id),
    FOREIGN KEY (bill_id) REFERENCES bills (bill_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = INNODB;

编辑:

为了进一步说明,如果items.total和payments.amount共享相同的foreign(bill_id)密钥,我希望将它们组合在一起。

以下是每个表格行的外观:

bill_id,
创造,
所有payment.total列的总和,共享相同的bill_id,
所有payment.amount列的总和,共享相同的bill_id

让我们假装我拥有一个柠檬水摊,你以每个1美元的价格购买3杯柠檬水;而不是给你这样的收据:

账单#1,Lemonade @ $ 1.00,支付1.00美元 账单#1,Lemonade @ $ 1.00,支付1.00美元 账单#1,Lemonade @ $ 1.00,支付$ 1.00

看起来像这样:

账单#1,Lemonade @ $ 3.00,支付3.00美元

希望这有帮助!

编辑:

这就是我创建账单,项目和付款(缩短)的方式:

#Create a bill
$q = "INSERT INTO bills (created) VALUES(NOW())";

#Create an item
$q = "INSERT INTO items (bill_id, total) VALUES('$bill_id', '$total')";

#Create a payment
$q = "INSERT INTO payments (bill_id, amount) VALUES('$bill_id', '$amount')";

创建项目或账单时,我给他们bill_id,以便我以后可以合并它们;这是我单独查看每个账单的方式:

http://i.imgur.com/oavKiKt.png

相反,我希望能够对一张表中的所有账单做同样的事情。

2 个答案:

答案 0 :(得分:0)

你可以试试这个(虽然没经过测试):

select b.id, b.created, (sum(i.total) + sum(p.amount)) as amount
from bills b join items i on b.id = i.bill_id
join payments p on b.id = p.bill_id
group by b.id, b.created

答案 1 :(得分:0)

我找到了解决方案;它可能不是最好的方法,但似乎可以做到这一点。

SELECT
    b.bill_id,
    b.created,
    SUM(i.total) AS total,
    p.amount
FROM bills b
JOIN items i
    ON b.bill_id = i.bill_id
JOIN
(
    SELECT bill_id, SUM(amount) AS amount
    FROM payments
    GROUP BY bill_id
) p
    ON b.bill_id = p.bill_id
    GROUP BY b.bill_id

这将使用相同的b.bill_id外键收集所有列(项目,付款)的SUM。

http://i.imgur.com/rx3wvPY.png

如果你有更好的解决方案,我很乐意听到它!