mysql分组取出每组地⼀条数据_基于mysql实现groupby取各
分组最新⼀条数据
基于mysql实现group by取各分组最新⼀条数据
前⾔:
group by函数后取到的是分组中的第⼀条数据,但是我们有时候需要取出各分组的最新⼀条,该怎么实现呢?
本⽂提供两种实现⽅式。
⼀、准备数据
⼆、三种实现⽅式
1)先order by之后再分组:
SELECT * FROM (SELECT * from tb_dept ORDER BY id descLIMIT 10000) a GROUP BY parent_id;
不加LIMIT可能会⽆效,由于mysql的版本问题。但是总觉得这种写法不太正经,因为如果数据量⼤于Limit 的值后,结果就不准确了。所以就有了第⼆种写法。
2)利⽤max() 函数:
SELECT * FROM tb_dept td,(SELECT max(id) id FROM tb_dept GROUP BY parent_id) md where td.id = md.id;
3)利⽤ where 字段名称 in (...) 函数:
SELECT * FROM tb_dept WHERE id IN (SELECT MAX(id) FROM tb_dept GROUP BY parent_id);
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持我们。
时间: 2020-09-15
在平时的开发任务中我们经常会⽤到MYSQL的GROUP BY分组, ⽤来获取数据表中以分组字段为依据的统计数据.⽐如有⼀个学⽣选课表,表结构如下: Table: Subject_Selection Subject Semester Attendee --------------------------------- ITB001 1 John ITB001 1 Bob
ITB001 1 Mickey ITB001 2 Jenny ITB001 2 James MKB114 1 John MKB1
原因: MySQL 5.7.5和up实现了对功能依赖的检测.如果启⽤了only_full_group_by SQL模式(在默认情况下是这样),那么MySQL就会拒绝选择列表.条件或顺序列表引⽤的查询,这些查询将引⽤组中未命名的⾮聚合列,⽽不是在功能上依赖于它们.(在5.7.5之前,MySQL没有检测到功能依赖项,only_full_group_by在默认情况下是不启⽤的.关于前5.7.5⾏为的描述,请参阅MySQL 5.6参考⼿册.) 执⾏以下个命令,可以查看 sql_mode 的内容: mys
--按某⼀字段分组取最⼤(⼩)值所在⾏的数据 复制代码 代码如下: /* 数据如下: name val 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 5 b5b5b5b5b5 */ --创建表并插⼊数据: 复制代码 代码如下: create table tb(name varchar(10),val int,memo varchar(20)
groupby是什么函数我这⾥创建了⼀个 goods 表,先看下⾥⾯的数据: mysql> select * from goods; +----+------+------+------------+-------------+------------+ | id | s_id | b_id | goods_name | goods_price | goods_desc | +----+------+------+------------+-------------+------------+ | 1 | 1 | 5
本⽂实例讲述了mysql使⽤GROUP BY分组实现取前N条记录的⽅法.分享给⼤家供⼤家参考,具体如下: MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下⾯我来讲述mysql中GROUP BY分组取前N条记录实现⽅法. 这是测试表(也不知道怎么想的,当
时表名直接敲了个aa,汗~~~~): 结果: ⽅法⼀: 复制代码 代码如下: SELECT a.id,a.SName,a.ClsNo,a.Score FROM aa a LEFT J
由于GROUP BY 实际上也同样会进⾏排序操作,⽽且与ORDER BY 相⽐,GROUP BY 主要只是多了排序之后的分组操作.当然,如果在分组的时候还使⽤了其他的⼀些聚合函数,那么还需要⼀些聚合函数的计算.所以,在GROUP BY 的实现过程中,与 ORDER BY ⼀样也可以利⽤到索引. 在MySQL 中,GROUP BY 的实现同样有多种(三种)⽅式,其中有两种⽅式会利⽤现有的索引信息来完成 GROUP BY,另外⼀种为完全⽆法使⽤索引的场景下使⽤.下⾯我们分别针对这三种实现⽅式做⼀个分
昨天有个需求对数据库的数据进⾏去重排名,同⼀⽤户去成绩最⾼,时间最短,参与活动最早的⼀条数据进⾏排序.我们可以利⽤MySQL中的group by的特性. MySQL的group by与Oracle有所不同,查询得字段可以不⽤写聚合函数,查询结果取得是每⼀组的第⼀⾏记录. 利⽤上⾯的特点,可以利⽤mysql实现⼀种独特的排序: ⾸先先按某个字段进⾏order by,然后把有顺序的表进⾏分组,这样每组的成员都是有顺序的,⽽mysql默认取得分组的第⼀⾏.从⽽得到每组的最值. select id, (
创建表&创建索引 create table tbl1 ( id int unique, sname varchar(50), index tbl1_index_sname(sname desc) ); 在已有的表创建索引语法 create [unique|fulltext|spatial] index 索引名 on 表名(字段名 [长度] [asc|desc]); MySQL也能利⽤索引来快速地执⾏ORDER BY和GROUP BY语句的排序和分组操作. 通过索引优化来实现MySQL的ORDER
MySQL分组排序求Top N 表结构 按照grp分组,按照num排序,每组取Top 3,输出结果如下: 源代码: SELECT * FROM score AS t3 WHERE ( SELECT COUNT(*) FROM score AS t1 LEFT JOIN score AS t2 p = t2.grp AND t1.num < t2.num WHERE
t1.id = t3.id ) < 3 ORDER p ASC, num DESC 在where中
满⾜GROUP BY⼦句的最⼀般的⽅法是扫描整个表并创建⼀个新的临时表,表中每个组的所有⾏应为连续的,然后使⽤该临时表来到组并应⽤累积函数(如果有).在某些情况中,MySQL能够做得更好,即通过索引访问⽽不⽤创建临时表. 为GROUP BY使⽤索引的最重要的前提条件是所有GROUP BY列引⽤同⼀索引的属性,并且索引按顺序保存其关键字.是否⽤索引访问来代替临时表的使⽤还取决于在查询中使⽤了哪部分索引.为该部分指定的条件,以及选择的累积函数. 由于GROUP BY 实
本⽂实例讲述了mysql group_concat 实现把分组字段写成⼀⾏的⽅法.分享给⼤家供⼤家参考,具体如下: 功能:将group by产⽣的同⼀个分组中的值连接起来,返回⼀个字符串结果. 函数语法: group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator '分隔符'] ) ⽰例 查询⽂章列表,将同⼀⽂章多个标签作为⼀个字段 标签表结构 CREATE TABLE `book_tag` ( `id` int(10)
group by函数应该的使⽤应该是SELECT 列表中指定的每⼀列也必须出现在 GROUP BY ⼦句中,除
⾮这列是⽤于聚合函数,但是今天帮同事调试⼀个mysql中的group by函数,让我⼤跌眼镜,当时感觉不可思议,然后回来做了个简化版试验,试验过程如下: mysql表结构 复制代码 代码如下: mysql> desc t;+---+----–+--+-–+---+---+| Field | Type | Null | Key | Default | Extra |+---+----–+-
mysql获取group by内部可以获取到某字段的记录分组统计总数,⽽⽆法统计出分组的记录数. mysql的SQL_CALC_FOUND_ROWS 使⽤获取查询的⾏数 在很多分页的程序中都这样写: 代码如下 SELECT COUNT(*) from `table` WHERE ......; 查出符合条件的记录总数 代码如下 SELECT * FROM `table` WHERE ...... limit M,N; 查询当页要显⽰的数据 这样的语句可以改成: 代码如下 SELECT SQL_
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论