Mysql 联接时不同表的平均值

Mysql 联接时不同表的平均值,mysql,sql,Mysql,Sql,以及查询 CREATE TABLE `reviews` ( `id` int(11) NOT NULL, `average` decimal(11,2) NOT NULL, `house_id` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `reviews` (`id`, `average`, `house_id`) VALUES (1, '10.00', 1), (2, '10.00', 1)

以及查询

CREATE TABLE `reviews` (
  `id` int(11) NOT NULL,
  `average` decimal(11,2) NOT NULL,
  `house_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `reviews` (`id`, `average`, `house_id`) VALUES
(1, '10.00', 1),
(2, '10.00', 1);
ALTER TABLE `reviews`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `reviews`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

CREATE TABLE `dummy_reviews` (
  `id` int(11) NOT NULL,
  `average` decimal(11,2) NOT NULL,
  `house_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `dummy_reviews` (`id`, `average`, `house_id`) VALUES
(0, '2.00', 1);
ALTER TABLE `dummy_reviews`
  ADD PRIMARY KEY (`id`);
结果是

SELECT
  AVG(r.average) AS avg1,
  AVG(dr.average) AS avg2
FROM
  reviews r
LEFT JOIN
  dummy_reviews dr ON r.house_id = dr.house_id
现在一切正常,但(10+2)/2=6。。。错误结果

我需要(10+10+2)/3=7,33。。。我怎样才能得到这个结果


您加入了值,因此您不会有3行,而是有2行。您需要的是一个并集,这样您就可以拥有平均表中的所有行,并从中进行计算。像这样:

avg1        avg2    
10.000000   2.000000

请看这里:

乔治的答案是最简单的方法(我适时地投了赞成票)。针对您的评论,您可以执行以下操作:

select avg(average) from
  (select average from reviews
   union all
   select average from dummy_reviews
  ) queries

事实上,我建议这样做不仅仅是因为你的评论。在某些情况下,这可能是性能更好的代码

你的解决方案是正确的。还有其他解决办法吗。。。不使用union?根据您当前的设计和预期的结果,恐怕不行。为什么你需要它在其他方面?也许如果你解释一下,我可以这样想。渴望的结果是具有不同参数的大连接(8个表)的一部分。。。我正在考虑以某种方式整合您的解决方案。。。否则我将需要使用你的解决方案。。。把同样的参数传递给我看看戈登的答案。它可能更符合你的要求。我刚刚了解到可以用另一种方式来完成:)真棒的答案:)。。。谢谢谢谢@JorgeCampos他的回答是正确的also@Florin . . . 我很感激你接受这个答案(我真的接受),但我认为你应该接受豪尔赫的答案。它更简单、正确,而且是第一个。
select ( (coalesce(r.suma, 0) + coalesce(d.suma, 0)) /
         (coalesce(r.cnt, 0) + coalesce(d.cnt, 0))
       ) as overall_average
from (select sum(average) as suma, count(*) as cnt
      from reviews
     ) r cross join
     (select sum(average) as suma, count(*) as cnt
      from dummy_reviews
     ) d;