我有两个MySQL表,结构如下(我删除了不相关的列)。从两个不同的表中获取两列的总和
mysql> DESCRIBE `edinners_details`;
+------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+----------------+
| details_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| details_pupil_id | int(11) unsigned | NO | | NULL | |
| details_cost | double unsigned | NO | | NULL | |
+------------------+------------------+------+-----+---------+----------------+
mysql> DESCRIBE `edinners_payments`;
+------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+----------------+
| payment_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| payment_pupil_id | int(11) unsigned | NO | | NULL | |
| payment_amount | float unsigned | NO | | NULL | |
+------------------+------------------+------+-----+---------+----------------+
系统的工作方式是,你为了一顿饭每餐有代价的,这些订单都存储在edinners_details
。一个例子行将如下:
mysql> SELECT * FROM `edinners_details` LIMIT 1;
+------------+------------------+--------------+
| details_id | details_pupil_id | details_cost |
+------------+------------------+--------------+
| 1 | 18343 | 25 |
+------------+------------------+--------------+
,通常人们会在散装这些饭菜支付 - 如果他们有£40,价值超过20天的过程饭菜,他们会支付其关闭,在结束这个月。他们每次付出的时间,一个新行进入edinners_payments
表,例如一行,这将是如下:
mysql> SELECT * FROM `edinners_payments` LIMIT 1;
+------------+------------------+----------------+
| payment_id | payment_pupil_id | payment_amount |
+------------+------------------+----------------+
| 1 | 18343 | 20 |
+------------+------------------+----------------+
因此,从这两行,我们可以看到,此人是在债务电流£5 - 他们已经有25英镑的餐费,只需支付20英镑。随着时间的推移会有每个系统用户的很多行,我可以很容易地制定出做一个简单的查询,如
SELECT SUM(`details_cost`) AS `meal_total`
FROM `edinners_details`
WHERE `details_pupil_id` = '18343';
然后得到的量,他们已经身价有多少食物了他们支付的钱,我只是做这个查询:
SELECT SUM(`payment_amount`) AS `payment_total`
FROM `edinners_payments`
WHERE `payment_pupil_id` = '18343';
我的最终目标是能够看到谁欠的钱最多,但环我users
表中的每一位用户和运行这两个查询对他们来说,我相信它会很慢,所以我想要做的就是将上面的两个查询合并为一个,也许还有一个额外的列(meal_total
- payment_total
)这会给我欠款。我尝试了几种方法来完成这项工作,包括连接和子查询,但他们似乎都重复了edinners_details
中的每一行(edinners_payments
) - 因此,如果有3个细节和4个付款,您将会拥有取出12行,这意味着在列上做一个SUM()会给我一个远远超过它的值。证明这一点的一个好办法。将运行此查询:
SELECT * FROM (
SELECT `details_cost` AS `cost`
FROM `edinners_details`
WHERE `details_pupil_id` = '18343'
GROUP BY `details_id`
) AS `details`, (
SELECT `payment_amount` AS `amount`
FROM `edinners_payments`
WHERE `payment_pupil_id` = '18343'
GROUP BY `payment_id`
) AS `payment`;
这使我得到以下结果:
+------+--------+
| cost | amount |
+------+--------+
| 2.5 | 20 |
| 2.5 | 6 |
| 2.5 | 3 |
| 2.5 | 1200 |
| 2.5 | 20 |
| 2.5 | 6 |
| 2.5 | 3 |
| 2.5 | 1200 |
| 2.5 | 20 |
| 2.5 | 6 |
| 2.5 | 3 |
| 2.5 | 1200 |
| 2.5 | 20 |
| 2.5 | 6 |
| 2.5 | 3 |
| 2.5 | 1200 |
| 2.5 | 20 |
| 2.5 | 6 |
| 2.5 | 3 |
| 2.5 | 1200 |
+------+--------+
添加SUM到这一点,因为这样的:
SELECT SUM(`details`.`cost`) AS `details_cost`, SUM(`payment`.`amount`) AS `payment_total` FROM (
SELECT `details_cost` AS `cost`
FROM `edinners_details`
WHERE `details_pupil_id` = '18343'
GROUP BY `details_id`
) AS `details`, (
SELECT `payment_amount` AS `amount`
FROM `edinners_payments`
WHERE `payment_pupil_id` = '18343'
GROUP BY `payment_id`
) AS `payment`;
给我以下结果:
+--------------+---------------+
| details_cost | payment_total |
+--------------+---------------+
| 50 | 6145 |
+--------------+---------------+
如果这工作,details_cost
将12.5和payment_total
将1229,但事实并非如此。你可以清楚地看到上述结果的重复,我很抱歉,所有的费用都是2.5,这使得它有点不那么明显,但他们是5次单独的订单,有4次付款。有谁知道我会怎样去同时获得膳食订单费用的SUM()和SUM()?
感谢
你不会看到学生没有任何付款(但与晚餐)和学生没有晚餐(但与付款)。 – Furgas 2012-02-02 11:51:11
现在,它应该同时做到这一点。 – ekh 2012-02-02 12:25:23
你好, 非常感谢你,这正是我所期待的。我稍微修改了它,以便将债务计算添加到其中,并仅检索负债的人,这使我留下了[此查询](http://pastebin.com/g4GcLFhj)。再次感谢。 (另外:为什么我的新线路不能在这里工作?我正在做双空间..) – 2012-02-02 12:57:24