美文网首页mysql
[MySQL场景系列之二] 推荐排序

[MySQL场景系列之二] 推荐排序

作者: 捉虫大师 | 来源:发表于2015-06-11 20:17 被阅读134次

    前言

    很多情况下都有有列表页面展示,如购物网站,导航页,甚至搜索引擎都会有列表页。一旦涉及到列表页就会有排序问题,有排序页面,就有人为干预排序,这样才能赚钱嘛

    场景描述

    现有产品列表,源自表product,字段有product_id,name,现在product_id为2,6,8的产品的店主花了点钱,想把产品推到列表的前面,那么现在该如何处理?

    方案1

    我在项目中这么干过

    select product_id,name from product order by product_id not in (2,6,8) asc limit 10

    这样可以满足要求

    图1

    这里的“not in”也可以换成“<>”。

    方案2

    通过查找资料发现mysql有这么个函数:field

    通俗来说field函数一般这样用

    field(id, 'str1', 'str2', 'str3')
    

    在字段id中搜索,如果和str1相同,则返回1,以此类推分别返回1,2,3...没有匹配到的返回0,可以做个小实验

    select field(product_id, 2,6,8),product_id,name from product limit 10

    图2

    这样看起来就明显多了。网上的资料显示我们可以这样来完成这个排序任务
    ,比如这里stackoverflow

    然而我这样写

    select product_id,name from product order by field(product_id, 2,6,8) limit 10

    得到的结果却是这样的

    图3

    仔细想想,order by 默认的是asc,所以field返回是0的都排在了前面,而选中的几个返回了1,2,3排在了后面。那么我们把asc改成desc

    select product_id,name from product order by field(product_id, 2,6,8) desc limit 10

    图4

    结果还是和预期不同,仔细看图2,原来无论我们用desc还是asc都无法把排序变成1230000...,所以这个field在这种场景下是无法满足要求的。

    顺便提一下,这两种写法

    select 1,2,product_id,name from product limit 10

    图5

    select product_id,name from product order by 2 limit 10

    图6

    这两种写法都很坑爹,但是还是可以了解下的,第一种写法就是在查询出来的数据的基础上加一列“常数”,比如序号什么的,第二种写法中order by 2 是按第二个字段排序(我也是刚知道,原来字段的顺序还真有用),不信你把order by 2 改成 order by 1和order by 字段数+1试试。

    方案3

    也是用mysql自带的一个函数,locate
    locate(substr, str)返回子串substr在字符串str中第一次出现的位置

    同样,先来个测试

    select locate(product_id, '2,6,8'),product_id,name from product order by 2 limit 10

    图7

    这里返回的是1,3,5,因为逗号也算在内了,之所以不用‘268’做为字符串是为了避开26,268,这类id。
    看到这个测试之后,我想不用再继续下去了,后续同方案2。

    最后总结一句话就是:还是方案1简单粗暴。

    相关文章

      网友评论

        本文标题:[MySQL场景系列之二] 推荐排序

        本文链接:https://www.haomeiwen.com/subject/ajujqttx.html