原标题:Mysql原生语句高级运用技巧
1.sql中group by的使用
“group by”从字面上理解就是根据“by”指定的规则对数据进行分组,所谓的分组就是讲一个“数据集”划分成若干个“小区域”,然后进行数据处理。下面看一份原始表
简单的group by案例
select 类别,sum(数量) as 数量之和
form A
group by 类别
返回结果如下,实际就是分类汇总
group by和order by的示例
select 类别,sum(数量) as 数量之和
from A
group by 类别
order by sum(数量) desc
返回结果如下表
group by all示例
select 类别,摘要,sum(数量) as 数量之和
form A
group by all 类别,摘要
示例中则可以指定“摘要”字段,其原因在于“多列分组”,其执行结果如下表
2.sql中where和having使用
where子句的作用是在对查询进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件过滤出特定的组,也可以使用多个分组标准镜像分组
select 类别,sum(数量) as数量之和 from A
group by 类别
having sum(数量) > 18
示例:having和where的联合使用方法
select 类别,sum(数量) from A
where 数量 gt; 8
group by 类别
having sum(数量) gt; 10
3.单篇文章多条评论SQL案例运用
社区网站案例,单篇文章有多条评论,我想一个SQL语句搞定。一般思路是先查询出所有的文章,再foreach遍历去评论表中根据文章id查询评论数,但是这里不需要,我们只需要在查询字段中虚拟一个commnum评论数的字段。
SELECT
cy_comment.postid,
Count(cy_comment.postid) AS commnum,
cy_post.title
FROM
cy_comment
INNER JOIN cy_post ON cy_comment.postid = cy_post.id
WHERE
cy_post.addtime BETWEEN 1519975017
AND 1519975667
GROUP BY
cy_comment.postid
ORDER BY
commnum DESC,
cy_post.addtime DESC
LIMIT 15
文章评论表SQL语句查询前后结果对比,其中postid是文章id,ouid是用户id
查询出我只需要的id结果集
还有一种案例被广泛应用,就是某个时间段用户发评论数的排行
SELECT
cy_oauth_user.id,
cy_oauth_user.nickname,
cy_oauth_user.head_img,
Count(cy_comment.ouid) AS usernum
FROM
cy_oauth_user
INNER JOIN cy_comment ON cy_comment.ouid = cy_oauth_user.id
WHERE
cy_comment.date BETWEEN 1480681424
AND 1495988770
GROUP BY
cy_comment.ouid
ORDER BY
usernum DESC
LIMIT 12
跟上面类似,usernum是用户评论数,最后结果如下
责任编辑: