首页   >   代码编程

MySQL按照传入参数的顺序返回结果

在做一个自动推荐系统的时候,碰到了一个问题,我传入想做关联的tag,但是实际返回结果却不大对,一番追查下来,发现竟然是mysql返回结果集的时候,没有按照我传入参数的顺序,而是按照了ID从小到大的排列顺序,导致查询数据的时候,关联度最高的标签没有放在最前面。

查阅资料发现,mysql是允许指定这个返回参数顺序的,只不过要多加一个order by field (id, ....),现在用我的代码给大家演示一下这个问题。

mapper.xml映射文件:

<select id="gets" resultMap="resultMap">
    select
    <include refid="columns"/>
    from tag
    where deleted = 0 
    and id in 
    <foreach collection="ids" item="id" open="(" separator="," close=")">
    	#{id}
    </foreach>
</select>

mapper.java映射方法:

public Map<Integer, T> gets(Collection<Integer> ids) {
    if (CollectionUtils.isEmpty(ids)) {
        return null;
    }
    List<T> entitys = baseDao.gets(new LinkedHashSet<>(ids));
    if (CollectionUtils.isEmpty(entitys)) {
        return null;
    }
    Map<Integer, T> map = new LinkedHashMap<>();
    for (T entity : entitys) {
        map.put(entity.getId(), entity);
    }
    return map;
}

开始就是为了防止这个问题,我还特意写了一个LinkedHashSet来处理顺序,但是没想到问题出在了mysql身上。

查询结果:

MySQL按照传入参数的顺序返回结果

大家看到,我传入的顺序是倒序(我这里是碰巧,顺序可以随意打乱),但是返回的时候却变成了正序,导致我关联度最高的标签反而跑到后面去了,这影响可就大了,相当于自动推荐失败了。。。

加上order by field再来测试一下:

<select id="gets" resultMap="resultMap">
    select
    <include refid="columns"/>
    from tag
    where deleted = 0 
    and id in 
    <foreach collection="ids" item="id" open="(" separator="," close=")">
    	#{id}
    </foreach>
    order by field(
    id,
    <foreach collection="ids" item="id" open="" separator="," close="">
        #{id}
    </foreach>
    )
</select>

这个时候,查询的结果集就是按我指定的顺序来排列返回了!

MySQL按照传入参数的顺序返回结果

QQ群: 686430774  /  718410762

站长Q: 1347384268

如果文章有帮到你,可以考虑请博主喝杯咖啡!

分享到:

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2019-03-10

永久地址:https://www.jiweichengzhu.com/article/cedb2fe7a318496f835f8b825f6eeb84

评论