在做一个自动推荐系统的时候,碰到了一个问题,我传入想做关联的tag,但是实际返回结果却不大对,一番追查下来,发现竟然是mysql返回结果集的时候,没有按照我传入参数的顺序,而是按照了ID从小到大的排列顺序,导致查询数据的时候,关联度最高的标签没有放在最前面。
查阅资料发现,mysql是允许指定这个返回参数顺序的,只不过要多加一个order by field (id, ....),现在用我的代码给大家演示一下这个问题。
mapper.xml映射文件:
select from tag where deleted = 0 and id in #{id}
mapper.java映射方法:
public Mapgets(Collection ids) { if (CollectionUtils.isEmpty(ids)) { return null; } List entitys = baseDao.gets(new linkedHashSet<>(ids)); if (CollectionUtils.isEmpty(entitys)) { return null; } Map map = new linkedHashMap<>(); for (T entity : entitys) { map.put(entity.getId(), entity); } return map; }
开始就是为了防止这个问题,我还特意写了一个linkedHashSet来处理顺序,但是没想到问题出在了mysql身上。
查询结果:
大家看到,我传入的顺序是倒序(我这里是碰巧,顺序可以随意打乱),但是返回的时候却变成了正序,导致我关联度最高的标签反而跑到后面去了,这影响可就大了,相当于自动推荐失败了。。。
加上order by field再来测试一下:
这个时候,查询的结果集就是按我指定的顺序来排列返回了!



