先说需求

1.0 版本
刚开始是在 评论表 里查找 项目名 和 id不重复

我一开始是通过  group by 实现的
select PROJECT_ID,PROJECT_NAME
 	from COMMENT_MESSAGE
	where DELFLAG = 0
  group by PROJECT_ID,PROJECT_NAME

2.0 版本

需求增加,要求查询最近的5条记录。	

此需求分为两部分。

1、只查条5数据。2、按时间排序(最近的5条)

首先,我就加了一个 rownum  <= 5 ,

然后,我加了createdate字段用来排序

代码如下

select PROJECT_ID,PROJECT_NAME,CREATEDATE
 	from COMMENT_MESSAGE
	where DELFLAG = 0
	and rownum <= 5
  group by PROJECT_ID,PROJECT_NAME,CREATEDATE
  order by  CREATEDATE desc

结果顺利的翻车了。查出来的结果有重复的

mysql按时间倒序 sql语句按时间倒序_mysql按时间倒序


这样可用的数据就只有两条了,和需求的5条不符。

我发现出现这样的结果是
因为查询条件里有createdate,
由于createdate是唯一的,所以group by以后原本需要合并的数据无法合并了。
如果把createdate去掉,就没法排序(需求是要求取最近的5条)


为此我实验了好久上网查了许多资料,仍一无法解决问题。

不是结果重复,就是查出来的数据不足5条。

脑壳疼。。。。。

然后在同事的帮助下,用了一个中午,想了一个办法

将查出的数据按 项目id相同的分组排 并序加一个	序号(序号很重要) 

再取序号为1的就是既有createdate(可以排序啦~)又唯一的所有数据了

然后再处理这部分数据,将数据 order by 一下,
最终取数据的前5条就可以了

代码如下

select * from (
 
	select * from (//括号内的就是按 项目id相同的分组排 并序加一个序号
	
		SELECT PROJECT_ID,PROJECT_NAME,createdate,
		Row_Number() OVER (partition by PROJECT_ID ORDER BY createdate desc) rank 
		
		FROM COMMENT_MESSAGE 
		where PROJECT_NAME like concat(concat('%',''),'%')
		//这里是因为还有有个模糊搜索的功能
		)
	where rank=1 //再取序号为1的就是既有createdate又唯一的所有数据了
	order by createdate desc//再按时间排序一下
	)
where rownum <=5//最后只取前5条(oracle数据库)
order by createdate desc//按时间倒序排列一下

至此终于解决 取分组后的按时间倒序的前5条数据了

既兼顾了分组(取相同的数据的唯一一个)

又兼顾了按时间(createdate)排序

最终取5条数据(不多不少)

基本完美。

原本我都打算仅仅group by一下 取出所有分组后的数据,然后在java中将数据遍历一遍处理一下,但是想想这样不好,如果数据量大的话,那处理挺耗时间和资源的。


记录并分享一下,增加经验,供大家参考