mysql 多表 查询 之后 group bymysql 分组查询 order by 无法按照日期排序

mysql中group by和order by先排序后分组取每组最新数据
mysql中group by和order by先排序后分组取每组最新数据
发表于: 20:55:01
测试表数据如上,需求是取每天最新的一条数据:
错误sql演示
GROUP BY date(created_at)
ORDER BY created_at DESC
得到结果集:
错误原因分析:mysql先执行的分组,后执行的排序,所以我们需要拿到分组的数据如下:
GROUP_CONCAT(id ORDER BY created_at DESC)
date(created_at)
结果集如下:
可以看到,我们已经完成了先排序,后分组,只要将第一个id拿出来就可以了,最终正确sql如下:
SUBSTRING_INDEX(
GROUP_CONCAT(id ORDER BY created_at DESC),
date(created_at)
created_at DESC
Cras sit amet nibh libero, in gravida nulla. Nulla
Cras sit amet nibh libero, in gravida nulla. Nulla
Cras sit amet nibh libero, in gravida nulla. Nulla
Cras sit amet nibh libero, in gravida nulla. Nulla
Cras sit amet nibh libero, in gravida nulla. Nulla
Cras sit amet nibh libero, in gravida nulla. Nulla
Cras sit amet nibh libero, in gravida nulla. Nulla
Cras sit amet nibh libero, in gravida nulla. Nullamysql中order by分别 按两张表相同的属性排序为什么结果不一样_百度知道
mysql中order by分别 按两张表相同的属性排序为什么结果不一样
我有更好的答案
order by 排序的字段不同,前面是 student.sno 后面是 sc.sno
采纳率:58%
来自团队:
有对表修改的操作吗,如果保证在以上两条查询之间没有对表修改先问一下,这两条查询执行中间?order by是对满足条件的结果集进行排序,正常来讲结果集的记录条数是不会因为order by而有差异的
本回答被网友采纳
少发喹中西医结合喹中枥
两张表的内容完全一样么,可能跟创建索引先后有关系
有没有详细的各表数据?
其他2条回答
为您推荐:
其他类似问题
mysql的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。一聚教程网:一个值得你收藏的教程网站
mysql GROUP BY 与 ORDER BY数据排序问题
时间: 00:00:00
编辑:简简单单
来源:转载
有两个解决方法
1,where+(对小组进行排序)
2,从form返回的数据下手脚(即用子查询)
由where+group by的解决方法
对group by里的小组进行排序的函数我只查到group_concat()可以进行排序,但group_concat的作用是将小组里的字段里的值进行串联起来。
group_concat(id order by `date` desc) from `test` group by category_id
再改进一下
select * from `test` where id in(select SUBSTRING_INDEX(group_concat(id order by `date` desc),',',1) from `test` group by category_id ) order by `date` desc
子查询解决方案
select * from (select * from `test` order by `date` desc) `temp`& group by category_id order by `date` desc
FROM `ecm_copy_goods_change`
ORDER BY `cid` DESC
) `ecm_copy_goods_change`
GROUP BY goods_id
ORDER BY `cid` DESC
一个dz论坛使用调最后发布内容的案例分析
在使用mysql排序的时候会想到按照降序分组来获得一组数据,而使用order by往往得到的不是理想中的结果,那么怎么才能使用group by 和order by得到理想中的数据结果呢?
例如 有一个 帖子的回复表,posts( id , tid , subject , message , dateline ) ,
id为 自动增长字段, tid为该回复的主题帖子的id(外键关联), subject 为回复标题, message 为回复内容, dateline 为回复时间,用UNIX 时间戳表示,
现在要求 选出 前十个来自不同主题的最新回复
SELECT * FROM posts GROUP BY tid LIMIT 10
这样一个sql语句选出来的并非你想要的 最新的回复,而是最早的回复,实际上是某篇主题的第一条回复记录!
也就是说 GROUP BY 语句没有排序,那么怎么才能让 GROUP 按照 dateline 倒序排列呢?加上 order by 子句?
SELECT * FROM posts GROUP BY tid ORDER BY dateline DESC LIMIT 10
这条语句选出来的结果和上面的完全一样,不过把结果倒序排列了,而选择出来的每一条记录仍然是上面的记录,原因是 group by 会比 order by 先执行,这样也就没有办法将 group by 之前,也就是在分组之前进行排序了, 有网友会写出下面的sql 语句:
SELECT * FROM posts GROUP BY tid DESC ORDER BY dateline DESC LIMIT 10
也就是说 在 GROUP BY 的字段 tid 后面加上递减顺序,这样不就可以取得分组时的最后回复了吗?这个语句执行结果会和上面的一模一样,这里加上 DESC 和ASC对执行结果没有任何影响!其实这是一个错误的语句,原因是GROUP BY 之前并没有排序功能,mysql 手册上面说,GROUP BY 时是按照某种顺序排序的,某种顺序到底是什么顺序?其实根本没有顺序,因为按照tid分组,其实也就是说,把tid相等的归纳到一个组,这样想的话,GROUP BY tid DESC 可以认为是在按照 tid 分组的时候,按照tid进行倒序排列,这不扯吗,既然是按照tid分组,当然是tid相等的归到一组,而这时候按照tid倒叙还是升序有个P用!
有网友发明下面的语句:
SELECT * FROM posts GROUP BY tid , dateline DESC ORDER BY dateline DESC LIMIT 10
心想这样我就可以在分组前按照 dateline 倒序排列了,其实这个语句并没有起到按照tid分组的作用,原因还是上面的,在group by 字段后加 desc 还是 asc 是错误的写法,而这种写法 网友本意是想 按照 tid 分组,并且在分组的时候按照 dateline排倒序!而实际这句相当于下面的写法:(去掉 GROUP BY 字段后面的 DESC)
SELECT * FROM posts GROUP BY tid , dateline ORDER BY dateline DESC LIMIT 10
也就是说,按照 tid 和 dateline 联合分组,只有在记录tid和dateline 同时相等的时候才归纳到一组,这显然不可能, 因为 dateline 时间线基本上是唯一的!
有人写出下面的语句:
SELECT *,max(dateline) as max_line FROM posts GROUP BY tid ORDER BY dateline DESC LIMIT 10
这条语句的没错是选出了最大发布时间,但是你可以对比一下 dateline 和 max_dateline 并不相等!(可能有相当的情况,就是分组的目标记录只有一条的时候!)
为什么呢?原因很简单,这条语句相当于是 在group by 以后选出 本组的最大的 发布时间!对分组没有起到任何影响!因为SELECT子句是最后执行的!
后来更有网友发明了下面的写法!
SELECT *,max(dateline) as max_line FROM posts GROUP BY tid HAVING dateline=max(dateline) ORDER BY dateline DESC LIMIT 10
这条语句的预期结果和想象中的并不相同!因为你会发现,分组的结果中大量的记录没有了!为什么?因为 HAVING 是在分组的时候执行的,也就说:在分组的时候加上一个这样的条件:选择出来的 dateline 要和 本组最大的dateline 相等,执行的结果和下面的语句相同:
SELECT *,max(dateline) as max_line FROM posts GROUP BY tid HAVING count(*)=1 ORDER BY dateline DESC LIMIT 10
看了这条sql语句是不是明白了呢?
dateline=max(dateline) 只有在分组中的记录只有一条的时候才成立,原因很明白吧!只有一条他才会和本组的最大发布时间相等阿,(默认dateline为不重复的值)
原因还是因为 group by 并没有排序功能,所有的这些排序功能只是错觉,所以你最终选出的 dateline 和max(dateline) 永远不可能相等,除非本组的记录只有一条!GROUP BY 在分组的时候,可能是一个一个来找的,发现有相等的tid,去掉,保留第一个发现的那一条记录,所以找出来的 记录永远只是按照默认索引顺序排列的!
那么说了这么多,到底有没有办法让 group by 执行前分组阿?有的 ,子查询阿!
最简单的 :
SELECT * FROM (SELECT * FROM posts ORDER BY dateline DESC) GROUP BY tid ORDER BY dateline DESC LIMIT 10mysql中group by之后再用order by无效怎么解决_百度知道
mysql中group by之后再用order by无效怎么解决
我有更好的答案
(select avg_p from hs300_sql WHERE created_at=(SELECT MAX(created_at) FROM hs300_sql)AND period='06s' ORDER BY
quanzhong DESC )klimit 149;
采纳率:95%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我现在有一个文章表 有两个字段 id 和 catid我想给 每个catid 有8个分类 列出 最新发的一篇文章
select * from post gruop by ca
这样我只能取出 8条 id 最小的 也就是 最老的一篇文章
order by id 并不起作用
如何才能按照id号desc开始排序
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你select * 本来就是不严谨的写法,只是mysql兼容性比较强默认给你放最小的,如果sql带有group by,那么select里头只能包含group by中的列或者是聚合函数,你评论说的没法order by 是因为需要对max后的列加一个别名。
select max(id) id, catid from post group by ca
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
select * from post gruop by ca
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
gruop by catid 写在后面
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 mysql 分组查询 的文章

 

随机推荐