我有三张桌子:
票据
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
相反,我希望能够对一张表中的所有账单做同样的事情。
答案 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
如果你有更好的解决方案,我很乐意听到它!