SQL字符型字段按数字型字段排序

日期: 标签:SQL 7 条留言
如需帮忙改代码,或者WordPress二次开发、PHP网站建设等需求,可联系我购买付费服务:  点此联系我
文章目录

这是很久之前的就遇到的问题了,去年写了个WP插件:WordPress投票插件Ludou Simple Vote,由于有些使用者需要一个投票排行榜,所以需要用一条SQL来读取按得分排序的文章列表。

Ludou Simple Vote的投票得分结果是以自定义栏目的方式存储在WordPress的postmeta中,分值存放在meta_value字段,而meta_value字段类型是longtext,如果直接使用下面的SQL查询语句来排序:

ORDER BY `meta_value`

那么按得分排序得到的结果可能是:
1
10
11
123
1234
2
25
253
3

由于是按字母顺序排列,所以123排在了2的前面,显然不符合我们的要求,那么怎样才能按照我们预想的数字顺序排序呢?下面介绍两种方法。

一、采用MySQL的cast函数,转换字段格式

这里我们将meta_value字段转换成数值类型的字段DECIMAL,然后再进行排序:

ORDER BY CAST(`meta_value` AS DECIMAL)

需要注意的是,你所要排序的meta_value字段的值必须都是可转换成数字,否则将会出错。

二、使用MySQL绝对值函数ABS

使用MySQL绝对值函数ABS,它告诉MySQL使用绝对值来处理处理这个字段:

ORDER BY ABS(`meta_value`)

-- 完 --

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜博客 https://www.ludou.org/order-by-numeric-values-in-sql.html
露兜
kaapass@outlook.com  QQ 825533758

业余编程爱好者,主业是淘宝店主,卖些工艺品,感兴趣可以到我的淘宝店看看(旺旺不提供技术咨询):西西弗sisyphe

7 条留言

点此留言
  1. 向日葵媒体设计

    这次沙发了吧

  2. 侯永禄

    曾经wordpress 3.1 的时候,我帮人做过一个产品展示的主题,就是在主循环中'orderby' => meta_value,这样文章能够按照meta_value的值(也就是价格)排序。到了3.4版的时候,就不行了,meta_value的值只能是区间(0,10)。小于等于0或者大于等于10的话,该文章就不会出现在列表内,至今不知道为什么。还望指教。

    • Ludou

      @侯永禄 使用'orderby' => 'meta_value_num'
      详见文档:http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

  3. 习惯一个人的生活

    恩,这个挺有用的,近期在做一个项目,用到了数据库,mark一下。

  4. 蓬勃主机

    这种排序方法是很少见的 但是我以前也见过的

发表留言