我基本上有一个表可以保存每个日期的计数.我想创建一个查询,它给出了整个表的总计数,以及昨天的总计数.但是当我尝试两次加入表时,聚合关闭了.以下是如何复制结果的方法.

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

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

mysql创建表为什么第二次,mysql当我加入同一个表两次聚合是错误的相关推荐

  1. 如何用mysql创建股票数据库_个人MySQL股票数据库的建立日记

    #!/usr/bin/python # -*- coding: UTF-8 -*- import tushare as ts from sqlalchemy import create_engine ...

  2. mysql创建学生情况表(xs)结构,MySql章节复习资料

    第2章 数据库和表 [例2.2] 修改数据库mydata(假设mydata已经创建)的默认字符集和校对规则. ALTER DATABASE mydata DEFAULT CHARACTER SET g ...

  3. 一台mysql并发能力_mysql怎么支撑百万级并发-对于同一个表,MySQL支持多少个并发操作...

    到服务器的SQL最大并发连接数为16384.mysql百万级数据查询. 受服务器配置和网络环境的限制,实际服务器支持的并发连接数量会更小. MySQL流量大,并发问题高 因为mysql是一个线程的连接 ...

  4. mysql创建新用户

    学习目标: 提示:通过学习mysql创建新用户,掌握mysql的基本命令 学习内容: 提示:mysql创建新用户 例如: 进入mysql终端. use mysql;使用mysql数据库. 新建MySQ ...

  5. 【PHP MySQL】数据库专题 第二课 创建数据库 表

    [PHP & MySQL]✔️数据库专题✔️ 第二课 创建数据库 & 表 概述 MySQL 安装 MySQL 命令行 数据库创建 创建表 概述 从今天开始, 小白我将带领大家一起来补充 ...

  6. asp.net mysql 创建变_[ASP.net教程]EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型...

    [ASP.net教程]EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型 0 2018-06-30 07:00:08 官方教程: ...

  7. oracle与mysql创建表时的区别

    oracle创建表时,不支持在建表时同时增加字段注释.故采用以下方式: #创建表 CREATE TABLE predict_data as (id integer NOT NULL, uid varc ...

  8. mysql创建库几种方法_MySQL创建数据库的两种方法

    本文为大家分享了两种mysql创建数据库的方法,供大家参考,具体内容如下 第一种方法:使用 mysqladmin 创建数据库使用普通用户,你可能需要特定的权限来创建或者删除 mysql 数据库. 所以 ...

  9. mysql fnv算法_《高性能MySQL》读书笔记之创建高性能的索引

    索引是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化的最有效手段.索引能够轻易将查询性能提高几个数量级.创建一个最优的索引经常需要重写查询. 5.1索引基础 在MySQL中,存储引擎 ...

最新文章

  1. 为什么 P8 程序员的代码你写不出来?零拷贝了解一下
  2. linux 重新分区挂载,Linux:挂载磁盘分区,linux已挂载磁盘重新分区
  3. 理解MySQL——并行数据库与分区(Partition)
  4. (转) 服务接口统一返回的格式
  5. python爬虫案例-Python爬虫案例集合
  6. 06.系统编程-3.进程VS线程比较
  7. python SQLAlchemy数据库操作
  8. 手把手教你C语言静态库的开发
  9. js setTimeout和setInterval区别
  10. cmake BUILD_SHARED_LIB变量
  11. js多种方法:返回上一页
  12. 精通Android自定义View(十二)绘制圆形进度条
  13. 使用C#语言,从Excel2007中读取数据,并显示到Form中的DataGridView。
  14. A_A03_001 stc-isp 单片机烧录软件安装与使用
  15. asp.net铁路安全预警与决策支持系统
  16. 2018-03-28-日剂
  17. K3 LEDE踩坑专题
  18. 计算机专业职业适应性考试包括什么内容,2020年分类招生《职业适应性测试(职业技能测试)》大纲...
  19. 关于position: sticky的简单用法
  20. 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)

热门文章

  1. 上一篇的js处理失真数据存在问题换了种方法
  2. Angular No name was provided for external module 'XXX' in output.globals 错误
  3. PyTorch 笔记(06)— Tensor 索引操作(index_select、masked_select、non_zero、gather)
  4. Ubuntu 18 snap 占用 100%,卸载 snap
  5. Java学习-jsp内置对象Session
  6. 知识点回顾-简单的TableView单组数据展示/多组数据展示
  7. 点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例...
  8. 初学 Delphi 嵌入汇编[3] - 第一个 Delphi 与汇编的例子
  9. 为计算机编程序英语作文,计算机编程员英文简历范文
  10. android游戏课程设计,Miuka「游戏化课程设计」图卡18|好课程如何讲故事的