mysql创建表为什么第二次,mysql当我加入同一个表两次聚合是错误的
我基本上有一个表可以保存每个日期的计数.我想创建一个查询,它给出了整个表的总计数,以及昨天的总计数.但是当我尝试两次加入表时,聚合关闭了.以下是如何复制结果的方法.
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当我加入同一个表两次聚合是错误的相关推荐
- 如何用mysql创建股票数据库_个人MySQL股票数据库的建立日记
#!/usr/bin/python # -*- coding: UTF-8 -*- import tushare as ts from sqlalchemy import create_engine ...
- mysql创建学生情况表(xs)结构,MySql章节复习资料
第2章 数据库和表 [例2.2] 修改数据库mydata(假设mydata已经创建)的默认字符集和校对规则. ALTER DATABASE mydata DEFAULT CHARACTER SET g ...
- 一台mysql并发能力_mysql怎么支撑百万级并发-对于同一个表,MySQL支持多少个并发操作...
到服务器的SQL最大并发连接数为16384.mysql百万级数据查询. 受服务器配置和网络环境的限制,实际服务器支持的并发连接数量会更小. MySQL流量大,并发问题高 因为mysql是一个线程的连接 ...
- mysql创建新用户
学习目标: 提示:通过学习mysql创建新用户,掌握mysql的基本命令 学习内容: 提示:mysql创建新用户 例如: 进入mysql终端. use mysql;使用mysql数据库. 新建MySQ ...
- 【PHP MySQL】数据库专题 第二课 创建数据库 表
[PHP & MySQL]✔️数据库专题✔️ 第二课 创建数据库 & 表 概述 MySQL 安装 MySQL 命令行 数据库创建 创建表 概述 从今天开始, 小白我将带领大家一起来补充 ...
- 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 官方教程: ...
- oracle与mysql创建表时的区别
oracle创建表时,不支持在建表时同时增加字段注释.故采用以下方式: #创建表 CREATE TABLE predict_data as (id integer NOT NULL, uid varc ...
- mysql创建库几种方法_MySQL创建数据库的两种方法
本文为大家分享了两种mysql创建数据库的方法,供大家参考,具体内容如下 第一种方法:使用 mysqladmin 创建数据库使用普通用户,你可能需要特定的权限来创建或者删除 mysql 数据库. 所以 ...
- mysql fnv算法_《高性能MySQL》读书笔记之创建高性能的索引
索引是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化的最有效手段.索引能够轻易将查询性能提高几个数量级.创建一个最优的索引经常需要重写查询. 5.1索引基础 在MySQL中,存储引擎 ...
最新文章
- 为什么 P8 程序员的代码你写不出来?零拷贝了解一下
- linux 重新分区挂载,Linux:挂载磁盘分区,linux已挂载磁盘重新分区
- 理解MySQL——并行数据库与分区(Partition)
- (转) 服务接口统一返回的格式
- python爬虫案例-Python爬虫案例集合
- 06.系统编程-3.进程VS线程比较
- python SQLAlchemy数据库操作
- 手把手教你C语言静态库的开发
- js setTimeout和setInterval区别
- cmake BUILD_SHARED_LIB变量
- js多种方法:返回上一页
- 精通Android自定义View(十二)绘制圆形进度条
- 使用C#语言,从Excel2007中读取数据,并显示到Form中的DataGridView。
- A_A03_001 stc-isp 单片机烧录软件安装与使用
- asp.net铁路安全预警与决策支持系统
- 2018-03-28-日剂
- K3 LEDE踩坑专题
- 计算机专业职业适应性考试包括什么内容,2020年分类招生《职业适应性测试(职业技能测试)》大纲...
- 关于position: sticky的简单用法
- 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)
热门文章
- 上一篇的js处理失真数据存在问题换了种方法
- Angular No name was provided for external module 'XXX' in output.globals 错误
- PyTorch 笔记(06)— Tensor 索引操作(index_select、masked_select、non_zero、gather)
- Ubuntu 18 snap 占用 100%,卸载 snap
- Java学习-jsp内置对象Session
- 知识点回顾-简单的TableView单组数据展示/多组数据展示
- 点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例...
- 初学 Delphi 嵌入汇编[3] - 第一个 Delphi 与汇编的例子
- 为计算机编程序英语作文,计算机编程员英文简历范文
- android游戏课程设计,Miuka「游戏化课程设计」图卡18|好课程如何讲故事的