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 ...
随机推荐
- A/B HDU-1576(简单的数论题)
Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一 ...
- VC++ 窗口透明化及透明窗口上绘画、截图、轨迹
源文件:https://files.cnblogs.com/files/MrFengD/Temp.rar
- python内置函数0-1
# a=bool(None)# print(a) class Foo: def __repr__(self): return 'bbbbbbb'f = Foo()ret = ascii(f)print ...
- 并不对劲的bzoj4231: 回忆树
题目大意 \(n\)个点的树,每条边上有一个小写字母. 操作:给定2个点\(u\),\(v\)(\(u\)可能等于\(v\))和一个非空字符串\(s\),问从\(u\)到\(v\)的简单路径上的所有边 ...
- 使用kafka-eagle监控Kafka
# 监控kafka集群,开启监控趋势图使用 # 有一个问题,需要在kafka-server-start.sh文件中配置端口,有如下三种办法 # 第一种:复制并修改kafka目录,比如kafka-1,k ...
- ACM算法练习-——ZJU1164-Software CRC
具体的题目描述点此链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1164 这道题,说实话 ...
- 富文本二进制转换成string
].KindExplain); ) { explainString = explainString.Substring(, explainString.IndexOf() + , explainStr ...
- winfrom 界面时间动态加载
Timer time1 = new Timer(); private void time1_Tick(object sender, EventArgs e) { lTime.Text = DateTi ...
- C# List.sort排序(多权重,升序降序)
很多人可能喜欢Linq的orderBy排序,可惜U3D里面linq在Ios上会报错,所以就必须使用list的排序. 其实理解了并不难 升序降序比较 sort有三种结果 1,-1,0分别是大,小,相等. ...
- 你不知道的css各类布局(四)之响应式布局
响应式布局 概念 响应式布局指的是同一页面在不同屏幕尺寸下有不同的布局 布局特点 响应式设计的目标是确保一个页面在所有终端上(各种尺寸的PC.手机.手表.冰箱的Web浏览器等等)都能显示出令人满意的效 ...