(根据创建时间和更改时间)查询排序问题
直接上代码:
<select id="selectSysEssayList" parameterType="SysEssay" resultMap="SysEssayResult"> <include refid="selectSysEssayVo"/> <where> <if test="title != null and title != ''"> and title like concat('%', #{title}, '%')</if> <if test="imgPath != null and imgPath != ''"> and img_path = #{imgPath}</if> <if test="essayColumn != null and essayColumn != ''"> and essay_column = #{essayColumn}</if> <if test="createUser != null and createUser != ''"> and create_user = #{createUser}</if> <if test="essayStatus != null "> and essay_status = #{essayStatus}</if> and essay_status != 1 </where> order by COALESCE ( updated_at , created_at ) desc </select>
注意倒数第二行:
order by COALESCE ( updated_at , created_at ) desc
这里使用了coalesce(中文名:合并;讲解:函数需要许多参数,并返回第一个非NULL参数。如果所有参数都为NULL,则COALESCE函数返回NULL。)他是mysql中自带的属性,单讲有点过于平面!上代码:
SELECT COALESCE(NULL, 0)
返回值应该是:0利用他的这个特点,结合数据修改特性来判断:数据修改肯定时在创建之后!所以一条数据的修改时间一定在创建时间之后(这是一句废话,听懂的人在上句就应该听懂了,没听懂的继续听我讲!!)现在关键来了
COALESCE ( updated_at , created_at )
注意看update_at和create_at的前后顺序!
这里顺序不能乱,根据coalesce的属性介绍(函数需要许多参数,并返回第一个非NULL参数。如果所有参数都为NULL,则COALESCE函数返回NULL。)他会返回第一个不为空的参数,在进行排序是咱们是要拿出这条数据最大时间来进行比较,很明显修改时间一定比创建时间大!应该拿update_at来比较。
有的彦祖该问了:‘如果没有改过呢?’
那他就是null去第二个值create_at,然后与其他数据进行排序
有的彦祖又该问了:‘如果没有创建时间呢?’
那就两个值都是null,在排序时会按照null进行排
在这里插入图片描述