group by 后面 order by 失效问题

条件:
查询出学生最后一次的成绩。

全部数据显示:

在这里插入图片描述
mysql5.6
使用sql:

select a.score,a.name from ( select * from hehe order by id desc  ) a  group by a.name;

结果:

在这里插入图片描述
mysql5.7
使用同样语句:

在这里插入图片描述

可以看出order by失效了
5.7官方手册给出:

It must not have ORDER BY with LIMIT.

他们说order by 如果没有加limit 就会失效
加上limit:

在这里插入图片描述

可以了

第二种方法:

使用:substring_index 和concat_group函数
5.6 5.7均可

SELECT SUBSTRING_INDEX(GROUP_CONCAT(score ORDER BY id desc),',',1) as score,name  from   hehe  group by  name;

在这里插入图片描述

小李的是90 上一个是null concat_group 把小李最新成绩为null的过滤掉了 大家根据情况使用

简单介绍下substring_index:

substring_index(str,delim,count) 
说明:substring_index(被截取字段,关键字,关键字出现的次数) 

concat_group

一、concat()函数

功能:将多个字符串拼接成一个字符串
语法:concat(str1,str2,…)
返回结果为连接参数产生的字符串 如果有任何一个参数为NULL 则返回值NULL

 select concat(name,score) from hehe;

在这里插入图片描述

 select concat(period,',',award) as info from collect_ahsyxw;

在这里插入图片描述

注:-符号 如果参数多的话 需要更多的-符号 因此需要concat_ws()

二、concat_ws()函数

功能:一次性指定分隔符
语法:concat_ws(separator,str1,str2,…)
说明:第一个参数指定分隔符 分隔符不能为空 如果为NULL 则返回值NULL

select concat(',',name,score) from hehe;

在这里插入图片描述

 select concat_ws(null,name,score) from hehe;

在这里插入图片描述

三、group_concat()函数

序:在有group by查询语句中 select指定的字段要么包含在group by语句后面 作为分组的依据
要么就包含在聚合函数中

例子:

 select name,min(id) from hehe group by name;

在这里插入图片描述
select id,name from hehe order by name;
在这里插入图片描述

1.功能:将group by产生的同一个分组中的值连接起来 返回一个字符串结果
2.语法 group_concat([distinct]要连接的字段 [order by 排序字段 asc/desc][separator’分隔符’])
说明:通过使用distinct可以排除重复值 如果希望对结果中的值进行排序 可以使用order by子句 separator是一个字符串值
缺省为一个逗号
举例:
使用group_concat()和group by显示相同名字的人的id号
在这里插入图片描述
举例:
将上面的id号从小到大排序 且用’_'作为分隔符:
在这里插入图片描述
举例:以name分组的所有组id和score

在这里插入图片描述

id和score连在一起 看的不是那么直观 使用concat_ws() 对每组中的id,score进行分割

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在查询语句中,ORDER BY和GROUP BY是两个不同的操作。ORDER BY用于对结果集进行排序,而GROUP BY用于根据指定的列对结果集进行分组。根据引用所述,由于ORDER BY无法在GROUP BY之前使用,所以需要使用子查询来先进行排序,然后再进行分组。 然而,根据引用所述,Order By并不会对Group By内部进行排序,如果Group By后只有一条记录,那么Order By将无效。这意味着如果在使用GROUP BY进行分组后,结果集中只有一条记录,那么对该记录使用ORDER BY将不会产生任何效果。 在引用中提到的示例查询中,使用了GROUP BY和ORDER BY来进行分组和排序。该查询先根据条件进行筛选,并使用LEFT JOIN进行表连接,然后使用GROUP BY对sd.detail_id进行分组。最后使用ORDER BY对sd.create_time进行排序,并使用LIMIT限制结果集的数量。 综上所述,ORDER BY和GROUP BY在查询中有不同的作用和执行顺序。GROUP BY用于分组,而ORDER BY用于排序。但需要注意,在使用GROUP BY后,如果结果集只有一条记录,ORDER BY将不会产生任何效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Group By和Order By一起使用的问题](https://blog.csdn.net/tabvla/article/details/127688469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [sql 分页查询 order by和group by一起使用导致排序失效问题解决](https://blog.csdn.net/weixin_44863237/article/details/127804120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值