join on 和group

左边的表是article文章表,右边的是comment文章回复表。
今天mysql查询的时候,遇到了有趣的事,任务是查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面。
“文章id 文章标题 点击量 回复数量”,
没有回复的,默认回复数量为0. 最开始想到的答案是 select a.id,a.title,a.hits,count(c.comment_id) as total from article as a left join comment as c on a.id=c.art_id group by c.art_id order by total desc; 但是查询出来的结果却是明显不符合题意,少了一行数据;

正确答案是 select a.id,a.title,a.hits,count(c.comment_id) as total from article as a left join comment as c on a.id=c.art_id group by a.id order by total desc;

还有一种查询方法(但是结果有null,不符合题意):select a.id,a.title,c.num from article as a left join (select art_id, count(comment_id) as num from comment group by art_id) as c on a.id = c.art_id order by c.num desc;

他们的区别是什么?为什么会是这种结果?简单分析一下:先看这条语句 select a.id,a.title,a.hits from article as a left join comment as c on a.id=c.art_id;

根据结果来看就会明白join on 查询,会把满足a.id=c.art_id的数据每一条都查询出来,不论结果是否会重复(只要在表里的数据满足条件)。在这条语句基础上加count看看会发生什么,select a.id,a.title,a.hits,count(c.comment_id) as total from article as a left join comment as c on a.id=c.art_id;

只显示一条数据了,因为没有任何的条件限制,所以count是在查询的所有结果中计算回复数量。到这里可以回头看第一次查询语句,他是按照c.art_id来分组,然后count在分组的基础上计算每个分组的回复数量,而文章ID为2和4的没有对应的分组,所以count把他们按照一个组来处理了,就得到了如图所示的结果。而正确答案是按照a.id来分组的,也就是文章ID为2和4的有各自的分组,就得到了正确的结果。而第三种会有值为null的情况为什么?因为他是嵌套查询,select art_id, count(comment_id) as num from comment group by art_id;这条子句查询的结果是

也就是说相当于join on是查询文章表和这张表,而不是查询文章表和文章回复表了,也就是这两张表的left join on 正常查询的出来的结果。
join on 和group的更多相关文章
- sql-多表查询JOIN与分组GROUP BY
一.内部连接:两个表的关系是平等的,可以从两个表中获取数据.用ON表示连接条件 SELECT A.a,B.b FROM At AS A INNER JOINT Bt AS B ON A.m=B.n ...
- MySQL select from join on where group by having order by limit 执行顺序
书写顺序:select [查询列表] from [表] [连接类型] join [表2] on [连接条件] where [筛选条件] group by [分组列表] having [分组后的筛选条件 ...
- Mysql查询语句,select,inner/left/right join on,group by.....[例题及答案]
创建如下表格,命名为stu_info, course_i, score_table. 题目: 有如图所示的三张表结构,学生信息表(stu_info),课程信息表(course_i),分数信息表(sco ...
- Hibernate 抓取策略fetch-1 (select join subselect)
原文 :http://4045060.blog.51cto.com/4035060/1088025 部分参考:http://www.cnblogs.com/rongxh7/archive/2010/0 ...
- How to join a Ubuntu to Windows Domain
My testing environment: Windows Server 2012 R2 Essentials: With AD and standalone DC in one single b ...
- MySQL的Join使用
在MySQL(以5.1为例)中,表连接的语法可以参见MySQL官方手册:MySQL官方手册-JOIN 在查询中,连接的语法类似 SELECT select_expr FROM table_refere ...
- MySQL自学笔记_联结(join)
1. 背景及原因 关系型数据库的一个基本原则是将不同细分数据放在单独的表中存储.这样做的好处是: 1).避免重复数据的出现 2).方便数据更新 3).避免创建重复数据时出错 例子: 有供应商信息和产 ...
- 【Hive】Hive笔记:Hive调优总结——数据倾斜,join表连接优化
数据倾斜即为数据在节点上分布不均,是常见的优化过程中常见的需要解决的问题.常见的Hive调优的方法:列剪裁.Map Join操作. Group By操作.合并小文件. 一.表现 1.任务进度长度为99 ...
- Mysql 单表查询-排序-分页-group by初识
Mysql 单表查询-排序-分页-group by初识 对于select 来说, 分组聚合(((group by; aggregation), 排序 (order by** ), 分页查询 (limi ...
随机推荐
- python内置函数0-1
# a=bool(None)# print(a) class Foo: def __repr__(self): return 'bbbbbbb'f = Foo()ret = ascii(f)print ...
- Spring MVC(一)Spring MVC的原理
1.Spring MVC的目的 构建像Spring框架那样灵活和松耦合的Web应用程序. 2.Spring MVC中如何处理Request? 每当用户在Web浏览器中点击链接或者提交表单时,Reque ...
- Neo4j图数据库配置文件详解
For more details and a complete list of settings, please see https://neo4j.com/docs/operations-manua ...
- 《深入理解 java 虚拟机》学习 -- 内存分配
<深入理解 java 虚拟机>学习 -- 内存分配 1. Minor GC 和 Full GC 区别 概念: 新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java ...
- react中数据持久化缓存redux-persist
一.安装redux-persist: npm install redux-persist --save 二..babelrc中增加redux-persist配置: "plugins" ...
- eclipse 创建Java web项目 Cannot change version of project facet Dynamic web module to xxx
问题描述: 用Eclipse创建Java web项目时选择的Artifact Id为maven-artchetype-webapp,由于这个archetype比较老,用的servlet还是2.3的. ...
- jvm自带的监控机制
Jdk为我们提供了查看java服务运行时的监控情况 1.如下图所示,打开指定目录下的jconsole.exe应用程序文件. 2.双击后跳出如下界面,可以看到,我们可以监视本地的,也可以监视远程服务.本 ...
- Guava动态调用方法
前言 大家在Coding的时候,经常会遇到这样一个情况,根据不同的条件去执行对应的代码.我们通常的处理方式是利用if-else判断,或者直接switch-case,特别是jdk1.6之后,swith开 ...
- Redis之各版本特性
1.Redis2.6 Redis2.6在2012年正是发布,经历了17个版本,到2.6.17版本,相对于Redis2.4,主要特性如下: 1)服务端支持Lua脚本. 2)去掉虚拟内存相关功能. 3)放 ...
- HttpClient 源码阅读
在项目中常用的HttpClient,与我们非常的亲密,为了能处理遇到的Http问题,我们应该去了解里面的机制和实现. 官方文档:http://hc.apache.org/httpcomponents- ...