SQL|where, group by, order by去重实例之如何正确使用group by

需求

找出最近练习过的句子id,不能重复(练习保存在practice表中,句子保存在pth_sentences表中,一个pth_sentence纪录有多条practices纪录)。现在的情况是如果一个句子练习多次,会得到重复的pth_sentence_id,这样前端在列出来的时候呢,句子是重复的,我只想让句子显示一次,既pth_sentence_id只出现一次。

Practices的表结构是这样的:

CREATE TABLE `practices` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL, `pth_sentence_id` int(11) DEFAULT NULL, `local_sound` varchar(255) DEFAULT NULL, `comment` varchar(255) DEFAULT NULL, `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL, `soundfile` json DEFAULT NULL, `del` tinyint(1) DEFAULT '0', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=215 DEFAULT CHARSET=utf8mb4;

一步步写出满足需求的SQL语句好喽,以前老师就是这么教的。

最近句子练习纪录5条

so easy. 问题就是句子id有重复,需要去重。

加入group by

select * from practicesorder by created_at descgroup by pth_sentence_idlimit 5

出错了

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group by pth_sentence_id limit 10' at line 3

为啥呢?order by 需要在group by 的后面执行!并且要用where语句的话需要放在group by之前!

调整下顺序:

select * from practicesgroup by pth_sentence_idorder by created_at desclimit 5

还是出错,请原谅我好久没写SQL了:

1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'beginner.practices.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

为啥呢?因为id没有写在group by 语句中, group by 是要与聚合函数结合起来使用的。

好,我不写id了,改成这样呢?

select pth_sentence_id from practicesgroup by pth_sentence_idorder by created_at desclimit 5

继续出错。

1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'beginner.practices.created_at' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这回是group by中的created_at呢,说没有在group_by语句中。好,加进去。

倒是没错了,但结果不是我想要的,因为这连个id都没有,而且数据有重复。

加入id

怎么把id加进去呢?需要使用聚合函数,比如max, min这样的,看你实际的需要。

我这个例子里面加上max相当于说我要找出一个句子的练习中practice.id最大的那一个practice纪录!

但如果在group by里面添加created_at之后并没有去重,查了下,这种group by会同时在pth_sentence_id和created_at两个字段进行分组,不是按照pth_sentence_id这一个条件进行分组,这就需要最后神奇的下一步:

order by中加入max

order by 中的日期排序添加上max聚合函数,且:group by里面只有一个分组条件,pth_sentence_id,这样就得到了包含唯一pth_sentence_id的practices纪录,并且还是最近生成(按照created_at倒序排列)的5条practice记录。

加入where语句

最近的几次练习都是用户6的,所以与上面结果一致。

(0)

相关推荐

  • SQL查询去掉重复数据

    本文主要总结数据库去掉重复数据的方法 去掉重复数据的方法: 第一种:distinct 根据单个字段去重,能精确去重: 作用在多个字段时,只有当这几个字段的完全相同时,才能去重: 关键字distinct ...

  • MySQL递归查询上下级菜单

    正文 在传统的后台管理系统里面经常会需要展示多级菜单关系,今天我们来学一下如何使用一条SQL语句展示多级菜单. 现在我们有一张corpinfo单位表,里面有一个belong字段指向上级单位,首先来看一 ...

  • sql查询:行转列和 列转行

    目录 一.行转列 1.使用case-when-then 2.使用SUM(IF()) 生成列 3.使用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行 4.使用SUM(IF()) 生成 ...

  • sql 专题

    查询重复记录 select * from idc_aqzrr where dwmc in (select dwmc from idc_aqzrr group by dwmc having count( ...

  • MySQL的join使用

    #内连接 select * from auth_user u inner join auth_group g on u.id = g.id; #左连接 select * from auth_user ...

  • SQL多表连接查询(详细实例)

    本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建 ...

  • sql server查询(SELECT ,where,distinct,like 查询,in,is null,group by 和having,order by,as)

    基本查询: 实例表 1 示例表 2 --部门表 3 4 create table dept( 5 6 deptno int primary key,--部门编号 7 8 dname nvarchar( ...

  • sql中的group by 和 having 用法解析

    --sql中的group by 用法解析: -- Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". --它的作用是通过一定的规则将一 ...

  • order by和group by的区别

    order by: 用来对数据库的一组数据进行排序   desc:降序   asc:升序 group by: "By"指定的规则对数据进行分组,所谓的分组就是将一个"数据 ...

  • 3掌握SQL,学习这30个实例就足够了

    全面的实用教程 SQL是一种编程语言,用于管理以表格形式(即表)存储在关系数据库中的数据. 关系数据库由多个相互关联的表组成.表之间的关系是在共享列的意义上形成的. 有许多不同的关系数据库管理系统(例 ...

  • SQL开发中常用到的几种去重方案

    SQL开发中常用到的几种去重方案 distinct去重 stinct只能返回他的目标字段,而无法返回其他字段, select distinct name from user 一般distinct用来查 ...

  • SQL去重的三种方法技巧 你知道吗

    在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重. 在 MySQL 中通常是使用 distinct 或 group by子句,但在支持窗口函数的 s ...

  • 当粉丝朋友学会“缠论”后对个股的分析过程(实例)

    最近发文不多,和粉丝们聊天比较多.虽然回答的时间会比较晚,但还是互相学到不少的问题. 通过不短日子的交流,粉丝发来了他根据缠论对个股的分析的判断.先来看一下他是如何做的. 老得瑟评:先看月线,绿色线画 ...

  • 初一数学计算十大易错点实例精析,考试一定要多留心

    i初中数学 公众号 易错点一:书写不规范,抄写错误 刚开始接触有理数计算,有的同学往往将-1+(-5)写成-1+-5,-x写成-1x,这些基本的书写规范要注意. 甚至有同学常犯"抄错&quo ...