- 浏览: 549863 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (144)
- struts (1)
- 数据库 (13)
- Ext (4)
- mysql (10)
- PHP (2)
- informix (1)
- js (9)
- java (41)
- struts2 (9)
- wap (2)
- 浏览器 (2)
- hibernate (1)
- android (19)
- ibatis (2)
- css (1)
- 上传 html (1)
- kindeditor (1)
- sql service (2)
- spring (7)
- xml (1)
- oracle (1)
- log4j (2)
- 日期 (2)
- swing (5)
- jquery (4)
- eclipse (4)
- Maven (1)
- BUG (5)
最新评论
-
msdghs:
LZ你好,看了你的文章略有所获,但是里面的一些机制不是很明白, ...
spring quartz集群配置 -
linksky1018:
是我弄错啦,我忘了进行url解码了
java 汉字转Unicode -
linksky1018:
纯汉字转换还行
java 汉字转Unicode -
linksky1018:
貌似有问题吧
java 汉字转Unicode -
kizz:
谢谢您,帮了大忙
struts2 上传 验证图片大小 长宽
引用
类如 有一个帖子的回复表,posts( id , tid , subject , message , dateline ) ,
id 为 自动增长字段, tid为该回复的主题帖子的id(外键关联), subject 为回复标题, message 为回复内容, dateline 为回复时间,用UNIX 时间戳表示,
现在要求 选出 前十个来自不同主题的最新回复
SELECT * FROM posts GROUP BY tid LIMIT 10
这样一个sql语句选出来的并非你想要的 最新的回复,而是最早的回复,实际上是某篇主题的第一条回复记录!
也就是说 GROUP BY 语句没有排序,那么怎么才能让 GROUP 按照 dateline 倒序排列呢?加上 order by 子句?
看下面:
SELECT * FROM posts GROUP BY tid ORDER BY dateline DESC LIMIT 10
这条语句选出来的结果和上面的完全一样,不过把结果倒序排列 了,而选择出来的每一条记录仍然是上面的记录,原因是 group by 会比 order by 先执行,这样也就没有办法将 group by 之前,也就是在分组之前进行排序了, 有网友会写出下面的sql 语句:
SELECT * FROM posts GROUP BY tid DESC ORDER BY dateline DESC LIMIT 10
也就是说 在 GROUP BY 的字段 tid 后面加上递减顺序,这样不就可以取得分组时的最后回复了吗?这个语句执行结果会和上面的一模一样,这里加上 DESC 和ASC对执行结果没有任何影响!其实这是一个错误的语句,原因是GROUP BY 之前并没有排序功能,mysql 手册上面说,GROUP BY 时是按照某种顺序排序的,某种顺序到底是什么顺序?其实根本没有顺序,因为按照tid分组,其实也就是说,把tid相等的归纳到一个组,这样想的话,GROUP BY tid DESC 可以认为是在按照 tid 分组的时候,按照tid进行倒序排列,这不扯吗,既然是按照tid分组,当然是tid相等的归到一组,而这时候按照tid倒叙还是升序有个P用!
于 是有网友发明下面的语句:
SELECT * FROM posts GROUP BY tid , dateline DESC ORDER BY dateline DESC LIMIT 10
心 想这样我就可以在分组前按照 dateline 倒序排列了,其实这个语句并没有起到按照tid分组的作用,原因还是上面的,在group by 字段后加 desc 还是 asc 是错误的写法,而这种写法 网友本意是想 按照 tid 分组,并且在分组的时候按照 dateline排倒序!而实际这句相当于下面的写法:(去掉 GROUP BY 字段后面的 DESC)
SELECT * FROM posts GROUP BY tid , dateline ORDER BY dateline DESC LIMIT 10
也就是说,按照 tid 和 dateline 联合分组,只有在记录tid和dateline 同时相等的时候才归纳到一组,这显然不可能,因为 dateline 时间线基本上是唯一的!
有人写出下面的语句:
SELECT *,max(dateline) as max_line FROM posts GROUP BY tid ORDER BY dateline DESC LIMIT 10
这条语句的没错是选出了最大发布时间,但是你可 以对比一下 dateline 和 max_dateline 并不相等!(可能有相当的情况,就是分组的目标记录只有一条的时候!)
为 什么呢?原因很简单,这条语句相当于是 在group by 以后选出本组的最大的发布时间!对分组没有起到任何影响!因为SELECT子句是最后执行的!
后来更有网友发明了下面的写法!
SELECT *,max(dateline) as max_line FROM posts GROUP BY tid HAVING dateline=max(dateline)
ORDER BY dateline DESC LIMIT 10
这条语句的预期结果和想象中的并不相同!因为你会发现,分组的结果 中大量的记录没有了!为什么?因为 HAVING 是在分组的时候执行的,也就说:在分组的时候加上一个这样的条件:选择出来的 dateline 要和 本组最大的dateline 相等,执行的结果和下面的语句相同:
SELECT *,max(dateline) as max_line FROM posts GROUP BY tid HAVING count(*)=1
ORDER BY dateline DESC LIMIT 10
看 了这条sql语句是不是明白了呢?
dateline=max(dateline) 只有在分组中的记录只有一条的时候才成立,原因很明白吧!只有一条他才会和本组的最大发布时间相等阿,(默认dateline为不重复的值)
原 因还是因为 group by 并没有排序功能,所有的这些排序功能只是错觉,所以你最终选出的 dateline 和max(dateline) 永远不可能相等,除非本组的记录只有一条!GROUP BY 在分组的时候,可能是一个一个来找的,发现有相等的tid,去掉,保留第一个发现的那一条记录,所以找出来的记录永远只是按照默认索引顺序排列的!
那 么说了这么多,到底有没有办法让 group by 执行前分组阿?有的 ,子查询阿!
最简单的 :
SELECT * FROM (SELECT * FROM posts ORDER BY dateline DESC) GROUP BY tid ORDER BY dateline DESC LIMIT 10
也 有网友利用自连接实现的 ,这样的效率应该比上面的子查询效率高,不过,为了简单明了,就只用这样一种了,GROUP BY没有排序功能,可能是mysql弱智的地方,也许是我还没有发现,
期待高人拍砖!
以上转之:http://www.alixixi.com/program/a/2011012867346.shtml
我在按照作者的思路下解决了该麻烦,非常感谢作者啊!不过还有一点要注意,
SELECT * FROM (SELECT * FROM posts ORDER BY dateline DESC) 在这段代码后要为该查询语句起个别名,作表名使用,不然报错!
完全正确的写法:
SELECT * FROM (SELECT * FROM posts ORDER BY dateline DESC) BIAOMING GROUP BY tid ORDER BY dateline DESC LIMIT 10
原文章http://blog.sina.com.cn/s/blog_4a894d670100vdox.html
发表评论
-
不同版本的web.xml配置
2016-07-12 10:33 1033web.xml v2.3 <?xml version ... -
在线裁剪图片 Jcrop
2016-01-30 10:49 1549Jcrop 是一个功能强大的 jQuery 图像裁剪插件,结合 ... -
java.lang.OutOfMemoryError: PermGen space
2014-12-12 15:24 691解决办法增大tomcat JVM内存设置 参数说明: -Xm ... -
struts2的iterator标签遍历HashMap
2014-11-17 10:56 727hashmap中保存的是string,object,objec ... -
java session统计在线人数
2014-11-17 09:00 944首先创建监听器,监听器实现ServletContextAttr ... -
Log4j写入数据库详解
2014-09-04 16:10 804log4j是一个优秀的开源日志记录项目,我们不仅可以对输出 ... -
将jar文件打包成exe安装文件(三)
2014-08-13 09:43 868通过前两篇 将jar文件打包成exe安装文件(一) ... -
将jar文件打包成exe安装文件(二)
2014-08-13 09:34 1038在上一篇中《将jar文件打包成exe安装文件(一)》介绍了,如 ... -
将jar文件打包成exe安装文件(一)
2014-08-13 09:26 1536将java项目打成exe可运 ... -
如何用java jdbc 向数据库表插入大数据量
2013-11-26 17:17 1998jvm:-Xmx1024m size = 1000000,可以 ... -
MySQL 最快速清空数据表数据的 SQL 语句
2013-11-26 16:35 7332TRUNCATE TABLE '表名' 这样就利用SQL语 ... -
java获得当前时间一小时前的时间
2013-10-29 15:30 3426Calendar calendar = Calendar. ... -
log4j 日志输出至数据库
2013-10-28 11:19 19711、首先配置log4j ### set log leve ... -
mysql 生日提醒
2013-10-15 15:17 1235select datediff(DATE_ADD(&quo ... -
使用Dom4j合并多个xml文件
2013-09-25 16:55 4890SAXReader saxReader = new SAX ... -
Java利用Ibatis的ScriptRunner解析sql
2013-09-11 13:28 5399需要导入mybatis-3.0.5.jar包 java直接解析 ... -
java 解析sql脚本
2013-08-29 14:27 1519java执行sql脚本,一种是解析sql脚本,生成每一条sql ... -
Spring 泛型 反射调用方法
2013-08-26 14:52 1623Object cz=springUtil.getBean( ... -
spring中使用ApplicationContext
2013-08-26 14:47 1000声明一个SpringUtil,并且实现ApplicationC ... -
Java中如何获得所有实现该接口的子类
2013-08-26 09:58 2867public static List<Class&g ...
相关推荐
–按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: nameval memo a 2 a2(a的第二个值) a 1 a1–a的第一个值 a 3 a3:a的第三个值 b 1 b1–b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b ...
本文实例讲述了mysql获取group by总记录行数的方法,分享给大家供大家参考。具体方法分析如下: 一般来说,mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数。 mysql中可以使用...
8 MySQL 教程 8.1 联接和断开服务器 8.2 输入查询 8.3 常用查询的例子 8.3.1 列的最大值 8.3.2 拥有某个列的最大值的行 8.3.3 列的最大值:按组:只有值 8.3.4 拥有某个字段的组间...
对于初学者来说,一般用学生及其选课等信息这些基本的操作入手。...group by 表示 以······分组, 查询表中被选人数少于3的课程及人数: having 后跟附加条件, 4、其他聚集函数的应用: 最大值max()、最
3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1. 查找...
3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1. 查找...
3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1...
o 1.2 关于本手册 + 1.2.1 本手册中使用的约定 o 1.3 MySQL的历史 o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o 1.8 有用的MySQL相关链接 * 2 MySQL 邮件列表及...
8 MySQL 教程 8.1 联接和断开服务器 8.2 输入查询 8.3 常用查询的例子 8.3.1 列的最大值 8.3.2 拥有某个列的最大值的行 8.3.3 列的最大值:按组:只有值 8.3.4 拥有某个字段的...
3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1. 查找...
3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1...
3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1. 查找...
找出该字段的最大值:max(字段) 找出该字段的最小值:min(字段) 对该字段求和:sum(字段) 对该字段求平均值:avg(字段) 分组查询group by group by + 聚合函数 :分组统计/计算 group by + ...
3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 ...
MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下: grant all on mydb...
列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的...
MySql的用户管理是通过User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下: grant all on mydb...
3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1. 查找...