使用group从两个mysql表中获取结果

使用group从两个mysql表中获取结果,mysql,Mysql,我正在寻找从两个MYSQL表中获取结果的解决方案 第一个表是:rate_表 `id` int(11) NOT NULL auto_increment, `rate` float(5,4) NOT NULL, `amount` float(12,2) NOT NULL, INSERT INTO `rate_table` (`id`, `rate`, `amount`) VALUES (1, 4.1555, 100), (2, 4.1555, 100), (3, 4.4444, 50), 第二

我正在寻找从两个MYSQL表中获取结果的解决方案

第一个表是:rate_表

`id` int(11) NOT NULL auto_increment,
`rate` float(5,4) NOT NULL,
`amount` float(12,2) NOT NULL,


INSERT INTO `rate_table` (`id`, `rate`, `amount`) VALUES
(1, 4.1555, 100),
(2, 4.1555, 100),
(3, 4.4444, 50),
第二个表是:trans_表

`id` int(11) NOT NULL auto_increment,
`amount` float(12,2) NOT NULL,
`rate_id` int(11) NOT NULL,

INSERT INTO `trans_table` (`id`,  `amount`, `rate_id`) VALUES
(1, 20, 1),
(2, 30, 1);
现在,我需要根据
rate\u table.rate
,sum
rate\u table.amount
-sum
trans\u table.amount
从rate\u table.trade\u id=rate\u table.id对rate\u table.amount进行分组

所以上面的例子应该给出结果:

rate   |sum  | sum - sum second table
4.5555 | 200 | 150 |
4.4444 | 50  | 50  |

您可以尝试以下方法

请参阅


我只是稍微修改了一下巴尔马的回答

SELECT  rate, ratesum, ratesum - IFNULL(transsum, 0) sum_minus_sum
FROM (  SELECT id, rate, SUM(amount) ratesum
        FROM rate_table
        GROUP BY rate
) r LEFT JOIN (
        SELECT rate_id, SUM(amount) transsum
        FROM trans_table
        GROUP BY rate_id) t
ON r.id = t.rate_id;
编辑


尽管上面的查询产生了答案中给出的结果,但仍然不是正确的方法。通过按费率分组费率表,您将丢失其id,并且无法正确加入交易表。

到目前为止您尝试了什么?我的意思是,您是否有任何部分查询给了您错误的结果?是否有构建查询的问题。。。。因为当我使用group by rate时,rate_表中的ID是隐藏的,并且在您的答案中只得到一个idpost查询,这将是谁将帮助您的起点。在
rate_表中
为什么rate=4.1555两次?另外,预期输出中的速率不同。考虑使用十进制而不是浮点。
select rate_table.rate, SUM(rate_table.amount) as sum1,
COALESCE((SUM(rate_table.amount) - SUM(trans_table.amount)),
         SUM(rate_table.amount)) as sum2
from rate_table LEFT join trans_table on 
trans_table.rate_id = rate_table.id
group by rate_table.rate;
select rate, sum(rate_table.amount),  IFNULL(sum(rate_table.amount),0) - IFNULL(sum(IFNULL(trans_table.amount,0)),0) from
rate_table  inner join trans_table on trans_table.rate_id = rate_table.id group by rate_table.rate 

UNION

select rate, sum(rate_table.amount),  IFNULL(sum(rate_table.amount),0) from
rate_table  where rate not in (select rate from rate_table where rate in (select rate from rate_table, trans_table where trans_table.rate_id = rate_table.id)) group by rate_table.rate ;
;
SELECT  rate, ratesum, ratesum - IFNULL(transsum, 0) sum_minus_sum
FROM (  SELECT id, rate, SUM(amount) ratesum
        FROM rate_table
        GROUP BY rate
) r LEFT JOIN (
        SELECT rate_id, SUM(amount) transsum
        FROM trans_table
        GROUP BY rate_id) t
ON r.id = t.rate_id;