mysql查询的问题,group by和order by的问题

写下带不走的风 发布于 2019/02/02 11:07
阅读 1K+
收藏 2

【领华为电脑包】容器化时代到来!跳转机分配问题终于“有救”了!>>>

@yilin6263 你好,想跟你请教个问题:

我用mysql查询的时候,想先order  by 然后在group by。其中order by的条件和 groupby 的条件是不一样的。但是结果不是我想要的。请问有什么玄机吗?

举例:

select * from (

select *from a order by a.add_time desc // 假如这个查询id=1的结果有3条,我想先按照add_time 排序,然后通过后面的group by 获取时间最大的一条

)t group by t.id 

结论:

获取的不是里面order by后的第一条,是默认按照id排序的第一条。

加载中
0
写下带不走的风
写下带不走的风

知乎上面众多大佬也是没有法子。。。不知道这里有没有。https://www.zhihu.com/question/20863388

0
w
wjiali6
这个语句能跑,不报语法错误感觉很神奇,grouo by id ,后应该是会以id为主键去生成汇总后的数据,但这是一条select *语句,不是一个组合函数。 另外,先排序再组合有些不合逻辑
a
aoliiiiii
回复 @写下带不走的风 : 楼主你好,我在工作业务中也遇见需要在动态数据中取最近时间/最早时间对应的数据,因此也是使用了GROUP_CONCAT (Order By) 和 SUBSTRING_INDEX 函数,但是我是同时取时间,以及时间对应的用户或者其他信息,但是我现在实践的时候报表非常长,而且查询很慢,在SSRS上报表呈现几乎是不可能的。 请问你目前就这个部分有没有新的优化呢。谢谢!
写下带不走的风
写下带不走的风
真实业务就是有这种需求,目前我用了一种投机取巧的办法实现了。用group_concat我想要的那个字段(排序拼接)。然后查询结果再使用SUBSTRING_INDEX截取第一位
写下带不走的风
写下带不走的风
这个select * 只是示例。因为和查询出来的字段没关系所以我省略了。你可以理解成这个只是伪代码。
0
金浩亮
金浩亮

先group  by id   查出 max(time),id   当新表 , 然后在排序 找。。

写下带不走的风
写下带不走的风
你的方法可以,我找到了2种临时方案解决的。你这个算一种
0
开源中国首席动弹
开源中国首席动弹

先group by,再order by,group by后边的字字段要么查询字段要么是组函数

0
0x0110
0x0110

分组后排序需要插入序列号重新排序

0
y
yilin6263

没太理解需求,一般都是先groupby再orderby,如果你的需求是找出每组id里面时间最大的一条。那sql可以写成

select  max(time),id from a  group by id

写下带不走的风
写下带不走的风
这种不行。直接max(time),id 出来的id不是时间最大的那条记录的id
0
java大神起床啦
java大神起床啦

只能  同时  让一个  索引 生效   建议 最后 使用limit 1

 

0
demoeg
demoeg

这个貌似mysql能支持,oracle不能支持。

0
写下带不走的风
写下带不走的风

引用来自“yilin6263”的评论

没太理解需求,一般都是先groupby再orderby,如果你的需求是找出每组id里面时间最大的一条。那sql可以写成

select  max(time),id from a  group by id

首先,感谢回答。select max(time)的方案,虽然能够获取最大time。但是最大time对应的那条记录无法获取出来。这个方案也是我曲线解决方案里面的一种。但并不完美。

0
写下带不走的风
写下带不走的风

我造了模拟数据还原了现场:

返回顶部
顶部