mysql的group by应用
group_test ( id TINYINT(1) UNSIGNED NOT NULL, pubid TINYINT(1) UNSIGNED NOT NULL, userid TINYINT(1) UNSIGNED NOT NULL, uid TINYINT(1) NOT NULL, msgText VARCHAR(50) NULL DEFAULT NULL, msgTime VARCHAR(50) NULL DEFAULT NULL
)
COLLATE=’utf8_general_ci’
ENGINE=MyISAM
;
INSERT INTO group_test (id, pubid, userid, uid, msgText, msgTime) VALUES
(2, 4, 3, 1, ‘eee’, ‘2015’),
(3, 3, 1, 2, ‘abc’, ‘2015’),
(4, 3, 1, 2, ‘aaa’, ‘2015’),
(5, 3, 2, 1, ‘bbb’, ‘2015’),
(6, 3, 2, 1, ‘aaa’, ‘2015’),
(7, 3, 2, 1, ‘uuu’, ‘2015’),
(8, 5, 1, 4, ‘ooo’, ‘2015’),
(9, 5, 1, 4, ‘qaq’, ‘2015’),
(1, 4, 1, 3, ‘ddd’, ‘2015’);
条件为userid=1 or uid=1
并且以pubid进行分组
取组里最大的id并排序以id来desc
得出的结果应该为下面这3条
id pubid userid uid msgText msgTime
9 5 1 4 qaq 2015
7 3 2 1 uuu 2015
2 4 3 1 eee 2015
这里按照字面的可以写g.userid=1 or g.uid=1 group by g.pubid order by id desc
然后select max(id)即可如图
但是对比下可以看到第一行和第二行是错误的
分析:
将id分别换成3和8就和插入的数据一样了,如图:
这是为什么?
我们知道常规的 sql,对于group by来说一定要结合聚合函数,而且选择的字段除了聚合函数外,还必须在group by中出现,否则报错。但是在mysql中扩展了这样的功能, 它可以將未经聚合的选择字段不出现在group by中。
对于不加聚合函数的sql来说,它的功能结合了limit来得出结果。
limit的时候得到的并不是 最大最小的值,而是某一下group by结果集中第一行,也就是相当于先group by, 然后在每个group by下面进行limit 1。
这个的含义是max是个聚合函数,但是你没有在group by出现,所以它就自作主张的随机选择了一行。这也是mysql的特点,oracle是不存在的
那应该怎样解决:
1、先得到userid=1 or uid=1并且以pubid进行分组的取组里最大的id条件的id
2、用这个id与pubid再对应的表中取值
来自http://bbs.csdn.net/topics/391820686
mysql的group by应用的更多相关文章
- 转:深入研究mysql中group by与order by取分类最新时间内容
鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里, (不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQL ...
- MySQL优化GROUP BY-松散索引扫描与紧凑索引扫描
满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累积函数(如果有).在某些情况中,MySQL能够做得更好,即通过索引 ...
- 【mybatis】【mysql】mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
mybatis查询mysql,group by分组查询报错:Expression #1 of SELECT list is not in GROUP BY clause and contains no ...
- mysql使用GROUP BY分组实现取前N条记录的方法
MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道 ...
- mysql获取group by的总记录行数方法
mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数. mysql的SQL_CALC_FOUND_ROWS 使用 获取查询的行数 在很多分页的程序中都这样写: ...
- mysql count group by统计条数方法
mysql count group by统计条数方法 mysql 分组之后如何统计记录条数? gourp by 之后的 count,把group by查询结果当成一个表再count一次select c ...
- 深入研究mysql中group by与order by取分类最新时间内容
鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用 ContentProvider时可以使用子查询),主要方法是用SQL ...
- MySQL解惑——GROUP BY隐式排序
MySQL中GROUP BY隐式排序是什么概念呢? 主要是其它RDBMS没有这样的概念,如果没有认真了解过概念,对这个概念会感觉有点困惑,我们先来看看官方文档的介绍: 官方文档MySQL 5.7 Re ...
- MySQL解惑——GROUP BY隐式排序
原文:MySQL解惑--GROUP BY隐式排序 MySQL中GROUP BY隐式排序是什么概念呢? 主要是其它RDBMS没有这样的概念,如果没有认真了解过概念,对这个概念会感觉有点困惑,我们先来看看 ...
- MySql数据库GROUP BY使用过程中的那些坑
MySql数据库GROUP BY使用过程中的那些坑 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. 特别注意: group by 有一个原则,就是 select 后面的所有 ...
随机推荐
- 一种简单的权限管理ER图设计
权限管理支持动态地管理用户的角色和权限.权限代表用户可以在什么对象上进行什么操作:角色是一组权限的集合. PS:当增加或删除某个用户的角色时,系统自动将该角色对应的权限(角色 -权限关联表)增加或删除 ...
- 第七章 探秘Qt的核心机制-信号与槽
第七章 探秘Qt的核心机制-信号与槽 注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用 ...
- HTTP 错误 404.2 解决方案
HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面 详细错误:HTTP 错误 404.2 - Not Found ...
- java将多个连续的空格转化成一个空格
java将多个连续的空格转化成一个空格: System.out.println("a a".replaceAll(" + ", " ")); ...
- Projected Coordinate Systems
Coordinate Systems Projected Coordinate Systems This is an archive of a previous version of the ArcG ...
- DTCMS一些问题
站点管理,主站和手机站同时绑定不同域名 手机站会报错,解决方法为 主站不绑定 手机站绑定 关键问题为:不能和主站域名相同 PC模版文件下的JS文件夹下的commen.js和手机模版下的JS文件夹下的b ...
- DTcms列表隔行换色;loop自带行号
<%loop cdr2 bcategoryList%> <%if(cdr2__loop__id==1)%> <a class="no-bg" href ...
- EF迁移
第一步是为上下文启用迁移Enable-Migrations 命令 Add-Migration AddBlogUrl 将根据自创建上次迁移以来您对模型所做的更改,为下一次迁移搭建基架. Update-D ...
- 离线文档(DocSet)下载地址汇总
我分享的百度网盘地址,官网下载慢:http://pan.baidu.com/s/1uOBYQ 名称 下载地址 更新时间 IOS 9.2 031-43202-A.dmg 20151209 OS X 10 ...
- sirius的学习笔记(2)
原文来自网络,侵权删 if both values of in a or expression are true ,Python will select the first one, and the ...