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

时间:2013-07-16 11:59:46

标签: mysql

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

第一个表是:rate_table

`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_table

`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);

现在我需要{_ 1}}之前的rate_table小组结果,rate_table.rate总和{sum rate_table.amount trans_table.amount ....

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

trans_table.trade_id = rate_table.id

4 个答案:

答案 0 :(得分:1)

您可以尝试以下操作。

请参阅http://sqlfiddle.com/#!2/49f5b/24

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 ;
;

答案 1 :(得分:0)

SELECT rate, ratesum , ratesum-IFNULL(transsum, 0) sum_minus_sum
FROM (SELECT 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.rate = t.rate_id

答案 2 :(得分:0)

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;

fiddle

答案 3 :(得分:0)

我只是简单地修改了Barmar的答案

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,并且您无法正确加入交易表。