CREATE TABLE 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 (idpubiduseriduidmsgTextmsgTime) 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应用的更多相关文章

  1. 转:深入研究mysql中group by与order by取分类最新时间内容

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里, (不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQL ...

  2. MySQL优化GROUP BY-松散索引扫描与紧凑索引扫描

    满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累积函数(如果有).在某些情况中,MySQL能够做得更好,即通过索引 ...

  3. 【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 ...

  4. mysql使用GROUP BY分组实现取前N条记录的方法

    MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道 ...

  5. mysql获取group by的总记录行数方法

    mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数. mysql的SQL_CALC_FOUND_ROWS 使用 获取查询的行数 在很多分页的程序中都这样写: ...

  6. mysql count group by统计条数方法

    mysql count group by统计条数方法 mysql 分组之后如何统计记录条数? gourp by 之后的 count,把group by查询结果当成一个表再count一次select c ...

  7. 深入研究mysql中group by与order by取分类最新时间内容

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用 ContentProvider时可以使用子查询),主要方法是用SQL ...

  8. MySQL解惑——GROUP BY隐式排序

    MySQL中GROUP BY隐式排序是什么概念呢? 主要是其它RDBMS没有这样的概念,如果没有认真了解过概念,对这个概念会感觉有点困惑,我们先来看看官方文档的介绍: 官方文档MySQL 5.7 Re ...

  9. MySQL解惑——GROUP BY隐式排序

    原文:MySQL解惑--GROUP BY隐式排序 MySQL中GROUP BY隐式排序是什么概念呢? 主要是其它RDBMS没有这样的概念,如果没有认真了解过概念,对这个概念会感觉有点困惑,我们先来看看 ...

  10. MySql数据库GROUP BY使用过程中的那些坑

    MySql数据库GROUP BY使用过程中的那些坑 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. 特别注意: group by 有一个原则,就是 select 后面的所有 ...

随机推荐

  1. java集合 collection-list-ArrayList 去除ArrayList集合中的重复元素。

    import java.util.*; /* 去除ArrayList集合中的重复元素. */ class ArrayListTest { public static void sop(Object o ...

  2. 关于IE8以上 不引人css 症状

    不知道各位有没有体验过 这样的状况  在同一个文件夹中 <!DOCTYPE html> <html> <head> <meta charset="u ...

  3. log4j定义某个类的日志级别

    项目引入了定时任务后,当我把已有的定时任务删除后,控制台一直会打出类似于 [org.springframework.scheduling.quartz.LocalDataSourceJobStore] ...

  4. iOS 非ARC基本内存管理系列 4-autorelease方法和@autoreleasepool

    1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...

  5. httpd配置Gzip压缩

    以下设置在 /etc/httpd/conf/httpd.conf 文件末尾加入即可.(不同方式安装的httpd可能主配置文件位置不同,请自行查找) 一.mod_deflate模块:文件压缩 官方文档: ...

  6. 【MongoDB】 安装为windows services

    参考  http://stackoverflow.com/questions/2404742/how-to-install-mongodb-on-windows # mongodb.conf # da ...

  7. 2016 系统设计第一期 (档案一)MVC a标签 跳转 Html.ActionLink的用法

    html: <a class="J_menuItem" href="baidu.com">权限管理</a> cshtml: 原有样式: ...

  8. EXTJS 4.2 资料 控件之Grid 行编辑绑定下拉框,并点一次触发一次事件

    主要代码: { header: '属性值', dataIndex: 'PropertyValueName', width: 130, editor: new Ext.form.field.ComboB ...

  9. python学习笔记23(时间与日期 (time, datetime包))

    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime. time包 time包基于C语言的库函数(library functions).Python的解释器通 ...

  10. csu 1305 Substring (后缀数组)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1305 1305: Substring Time Limit: 2 Sec  Memory Limi ...