若依(根据创建时间和更改时间)查询排序问题

直接上代码:

<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进行排
在这里插入图片描述
在这里插入图片描述
这个一个简单的不知不觉讲了一大堆,希望可以帮到你!下个bug见

Logo

快速构建 Web 应用程序

更多推荐