加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

mysql当我插手统一个表两次聚合是错误的

发布时间:2021-03-04 18:41:52 所属栏目:编程 来源:网络整理
导读:我根基上有一个表可以生涯每个日期的计数.我想建设一个查询,它给出了整个表的总计数,以及昨天的总计数.可是当我实行两次插手表时,聚合封锁了.以下是怎样复制功效的要领. CREATE TABLE a (id int primary key);CREATE TABLE b (a_id int,b_id int,date date,c

我根基上有一个表可以生涯每个日期的计数.我想建设一个查询,它给出了整个表的总计数,以及昨天的总计数.可是当我实行两次插手表时,聚合封锁了.以下是怎样复制功效的要领.

CREATE TABLE a (id int primary key);
CREATE TABLE b (a_id int,b_id int,date date,count int,primary key (a_id,b_id,date));
INSERT INTO a VALUES (1);
INSERT INTO b VALUES (1,1,UTC_DATE(),5);
INSERT INTO b VALUES (1,2,10);
INSERT INTO b VALUES (1,UTC_DATE()-1,7);
INSERT INTO b VALUES (1,12);

SELECT A.id,SUM(B.count) AS total_count,SUM(Y.count) AS y FROM a AS A 
LEFT JOIN b AS B ON (B.a_id=A.id) 
LEFT JOIN b AS Y ON (Y.a_id=A.id AND Y.date=UTC_DATE()-1)
GROUP BY A.id;

Results in:
+----+-------------+------+
| id | total_count | y    |
+----+-------------+------+
|  1 |          68 |   76 |
+----+-------------+------+


The correct result should be:
+----+-------------+------+
| id | total_count | y    |
+----+-------------+------+
|  1 |          34 |   22 |
+----+-------------+------+

这里产生了什么?这是mysql中的错误照旧我不大白联接是怎样事变的. 最佳谜底 不,这不是MySQL中的错误.

您的JOIN前提正在天生“一再”行. (删除聚合函数和GROUP BY,你会看到产生了什么.

表“a”中的那一行与表“b”中的四行匹配.这统统都很好,很好.可是当您将毗连添加到第三个表(“y”)时,从第三个“y”表(两行)返回的每一行都与“b”表中的每一行“匹配”…以是你风功效齐集总共有八行. (这就是“total_count”增进一倍的缘故起因.)

要获取您指定的功效集,您不必要第二次插手该表“b”.相反,只需行使前提测试来确定“计数”是否应该包括在“y”总数中.

譬喻

SELECT a.id,SUM(b.count) AS total_count,SUM(IF(b.date=UTC_DATE()-1,b.count,0)) AS y
  FROM a a
  LEFT
  JOIN b b ON (b.a_id=a.id)
 GROUP BY a.id;

请留意,MySQL IF表达式可以替代为等效的ANSI CASE表达式,以进步可移植性:

,SUM(CASE WHEN b.date=UTC_DATE()-1 THEN b.count ELSE 0 END) AS y

假如你确实想第二次联接到谁人“b”表,你会但愿JOIN前提是这样的,“y”中的一行最多匹配“b”中的一行,以免先容任何一再.以是你根基上必要毗连前提来包括主键中的全部列.

(请留意,表“y”的毗连前提中的谓词担保每个来自“y”的匹配不会高出“b”中的一行):

SELECT a.id,SUM(y.count) AS y
  FROM a a
  LEFT
  JOIN b b
    ON b.a_id=a.id
  LEFT
  JOIN b y 
    ON y.a_id = b.a_id
   AND y.b_id = b.b_id
   AND y.date = b.date
   AND y.date = UTC_DATE()-1
 GROUP BY a.id;

(要得到返回沟通功效集的第一个语句,行使隐藏的NULL取代零,您必要将IF表达式中的’0’常量替代为’NULL’.

,NULL)) AS y

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读