mysql中group by用法(mysql使用GROUP BY分组实现取前N条记录的方法)

本文目录
- mysql使用GROUP BY分组实现取前N条记录的方法
- mysql GROUP BY、DISTINCT、ORDER BY语句优化
- mysql group by怎么用
- mysql筛选GROUP BY多个字段组合时的用法分享
- mysql中group by里面的问题
- MYSQL中多表查询 GROUP BY
- 求解MYSQL中GROUP BY的用法
mysql使用GROUP BY分组实现取前N条记录的方法
本文实例讲述了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
JOIN
aa
b
ON
a.ClsNo=b.ClsNo
AND
a.Score《b.Score
group
by
a.id,a.SName,a.ClsNo,a.Score
having
count(b.id)《2
ORDER
BY
a.ClsNo,a.Score
desc;
拆开分析:
《!--[if
!supportLists]--》1、
《!----》LEFT
JOIN
aa
b
ON
a.ClsNo=b.ClsNo
AND
a.Score《b.Score
同一个班级(每个班级四个人),分数比当前学生高的记录,那就意味这成绩垫底的学生,将会产生三条记录
《!--[if
!supportLists]--》2、
《!----》group
by
a.id,a.SName,a.ClsNo,a.Score
having
count(b.id)《2
a.id,a.SName,a.ClsNo,a.Score可以代表一个学生(以学生分组),如果count(b.id)《2(成绩超过你的人不能多于2个),那就只剩第一第二了。
方法二:
复制代码
代码如下:SELECT
*
FROM
aa
a
WHERE
2》(SELECT
COUNT(*)
FROM
aa
WHERE
ClsNo=a.ClsNo
and
Score》a.Score)
ORDER
BY
a.ClsNo,a.Score
DESC;
这个我觉得是比较有意思的,取每一条记录,判断同一个班级,大于当前成绩的同学是不是小于2个人。
方法三:
复制代码
代码如下:SELECT
*
FROM
aa
WHERE
id
IN
(SELECT
id
FROM
aa
WHERE
ClsNo=a.ClsNo
ORDER
BY
Score
DESC
LIMIT
2)
ORDER
BY
a.ClsNo,a.Score
DESC;
这种方式进过测试不通过,ERROR
1235
(42000):
This
version
of
MySQL
doesn’t
yet
support
’LIMIT
&
IN/ALL/ANY/SOME
subquery’
,不能在这几个子查询中使用limit。
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》
希望本文所述对大家MySQL数据库计有所帮助。
mysql GROUP BY、DISTINCT、ORDER BY语句优化
GROUP BY、DISTINCT、ORDERBY这几类子句比较类似,GROUP BY默认也是要进行ORDERBY排序的,笔者在本书中 把它们归为一类,优化的思路也是类似的。
可以考虑的优化方式如下。
1、尽量对较少的行进行排序。
2、如果连接了多张表,ORDERBY的列应该属于连接顺序的第一张表。
3、利用索引排序,如果不能利用索引排序,那么EXPLAIN查询语句将会看到有filesort。
4、GROUP BY、ORDERBY语句参考的列应该尽量在一个表中,如果不在同一个表中,那么可以考虑冗余一些列,或者合并表。
5、需要保证索引列和ORDERBY的列相同,且各列均按相同的方向进行排序。
6、增加sort_buffer_size。 sort_buffer_size是为每个排序线程分配的缓冲区的大小。增加该值可以加快ORDERBY或GROUP BY操作。但是,这是为每 个客户端分配的缓冲区,因此不要将全局变量设置为较大的值,因为每个需要排序的连接都会分配sort_buffer_size大小的内存。
7、增加read_rnd_buffer_size。 当按照排序后的顺序读取行时,通过该缓冲区读取行,从而避免搜索硬盘。将该变量设置为较大的值可以大大改进ORDER BY的性能。但是,这是为每个客户端分配的缓冲区,因此你不应将全局变量设置为较大的值。相反,只用为需要运行大查询 的客户端更改会话变量即可。
8、改变tmpdir变量指向基于内存的文件系统或其他更快的磁盘。 如果MySQL服务器正作为复制从服务器被使用,那么不应将“--tmpdir”设置为指向基于内存的文件系统的目录,或者当服务 器主机重启时将要被清空的目录。因为,对于复制从服务器,需要在机器重启时仍然保留一些临时文件,以便能够复制临时表 或执行LOADDATAINFILE操作。如果在服务器重启时丢失了临时文件目录下的文件,那么复制将会失败。
9、指定ORDERBY NULL。 默认情况下,MySQL将排序所有GROUP BY的查询,如果想要避免排序结果所产生的消耗,可以指定ORDERBY NULL。 例如:SELECT count(*) cnt, cluster_id FROM stat GROUP BY cluster_id ORDER BY NULL LIMIT 10; ·
10、优化GROUP BY WITHROLLUP。 GROUP BY WITHROLLUP可以方便地获得整体分组的聚合信息(superaggregation),但如果存在性能问题,可以考虑在应用层实现这个功能,这样往往会更高效,伸缩性也更佳。
11、使用非GROUP BY的列来代替GROUP BY的列。 比如,原来是“GROUP BYxx_name,yy_name”,如果GROUP BYxx_id可以得到一样的结果,那么使用GROUP BYxx_id也是可 行的。
12、可以考虑使用Sphinx等产品来优化GROUP BY语句,一般来说,它可以有更好的可扩展性和更佳的性能。
mysql group by怎么用
例子 aa表 a b
123 10
123 12
1234 11
1234 14
首先 group 是用来分组的 不是过滤重复项的。重复项删除语句 DISTINCT用这个 。 select DISTINCT(a) from aa
结果就是 a
123
1234
group by用来分组的
select a, sum(b) from aa group by a
sum意思是总和。结果就是
a b
123 22
1234 25
语句的目的是以a为目标 需要知道 相同名字的物品 在b列一共有多少数量总和
select a,count(b) from aa group by a
count 意思行数总和 结果就是
a b
123 2
1234 2
语句目的是 相同名字的物品 一共有几行
mysql筛选GROUP BY多个字段组合时的用法分享
想实现这样一种效果
如果使用group
by一个条件的话,得到的结果会少了很多,如何多个条件组合筛选呢
复制代码
代码如下:
group
by
fielda,fieldb,fieldc...
循环的时候可以通过判断后一个跟前面一个是否相同来分组,一个示例
复制代码
代码如下:
$result
=
mysql_query("SELECT
groups,name,goods
FROM
table
GROUP
BY
groups,name
ORDER
BY
name");
$arr
=
array();
$i
=
0;
while($row
=
mysql_fetch_array($result)){
$arr
=
$row;
}
$m
=
$i
-
1;
foreach($arr
as
$k=》$v){
if($v
《》
$v){
echo
’分割符号’;
}
echo
$v;
}
mysql中group by里面的问题
GROUP BY dept,name 的意思,就是先按dqpt分组,如果出现dept相同的,再按name分组,也就是说除非出现dept和name都相同的记录才会合为一组,否则的话是不会合在一起的,这样的话显示出的name就只有一个了。
你用现实生活中的例子来理解一下就很明白啦:比如说你们班上的同学如果按性别来分组,可以分为两组,如果按照姓名来分组,那就基本上有多少个同学就有多少组(除非有同名同姓的),那如果按性别和姓名同时分组呢,那分的组就是同学数的两倍了,即“男的张三”一组,“女的张三”一组,“男的李四”一组,“女的李四”一组……当然,这其中有一半的组是空的,剩下的也是每一组只有一个人啊!理解没有?
所以 Group by 后面的分组字段不是随便加的,多个字段的分组是需要排列组合的,分的组数会按几何级数增长!
补充说一句:本来按名字来分组就是个愚不可及的想法了!更何况还要加上其他分组条件,这样的话基本上就是一组只有一个了!
MYSQL中多表查询 GROUP BY
这么写:
select uid,name,max(dateline) dateline
from a,b
where a.uid = b.uid
group by uid,name
order by max(dateline)
求解MYSQL中GROUP BY的用法
SELECT col1, SUM(CASE WHEN col2 = ’X’ then 1 else 0 end),
SUM(CASE WHEN col2 = ’Y’ then 1 else 0 end)
from 表1
group by col1
即可。

更多文章:
asp是什么检查项目(医院血液检验项目RPR、TPPA、HIV-Ab各是什么意思)
2026年10月11日 10:20
汇编输出指令(用汇编语言循环指令在屏幕中间输出红底白字的“hello I am 720“)
2026年10月11日 07:20
本地搭建springboot项目(使用eclipse构建springboot项目)
2026年10月11日 06:20
java入门神器好用吗(java 7入门经典适合初学者自学用吗)
2026年10月11日 02:40
unix文件系统采用(Unix采用树形文件系统,其中“树形文件系统”什么意思)
2026年10月11日 00:50
数据可视化界面(FineBI的数据可视化组件设置界面分为哪些区域,错误的是)
2026年10月10日 22:20
matlab2017和2018哪个好(发现matlab2018a占内存较多,下载了2016a的版本,这两个版本有什么不一样的区别吗)
2026年10月10日 21:10





