今天给问说网添加一个排行榜的功能,主要就是列出了在本博客中阅读最多和评论最多的文章,但是却遇到了一个问题,阅读浏览量储存的字段类型是varchar,使用desc或者asc排序的时候,不是按照数字的大小的排序,而是按照字符串中的数字排序,接下来就为大家分享两个解决MySql数字字符串类型的字段排序问题。
字段*1或者+0
将字段*1或者+0可以将MySQL字符串字段按数值排序
select * from table where 1 order by id*1 desc;
或者
select * from table where 1 order by id+0 desc;
其实就是把字段当作一个int的类型处理。
利用find_in_set()进行无敌排序
FIND_IN_SET(str,strlist);
Returns a value 如果字符串 str 在由 N 个子串组成的列表 strlist 中,返回一个 1 到 N 的值。一个字符串列表是由通过字符 “,” 分隔的多个子串组成。如果第一个参数是一个常数字符串,并且第二个参数是一个 SET 列类型,FIND_IN_SET() 函数将被优化为使用位运算!
如果 str 在不 strlist 中或者如果 strlist 是一个空串,返回值为 0。如果任何一个参数为 NULL,返回值也是 NULL。如果第一个参数包含一个 “,”,这个函数将完全不能工作:
select p.*, find_in_set(p.products_id,$string_hot_pid) as rank from products p where p.products_id in ($string_hot_pid) order by rank
在实际操作时发现使用字符型的数值进行排序输出时出现了,2排在所有第一个字符为1的数字的后面
sql如下:
SELECT DISTINCT WEEK from bk_cmsindex WHERE Termid=" & termid & " order by week
怎么办内,方法就是按照数字型字段*1或+0让其变成数值型
SELECT DISTINCT WEEK from bk_cmsindex WHERE Termid=" & termid & " order by week*1
或
SELECT DISTINCT WEEK from bk_cmsindex WHERE Termid=" & termid & " order by week+0
补充
一、采用MySQL的cast函数,转换字段格式
这里我们将meta_value字段转换成数值类型的字段DECIMAL,然后再进行排序:
ORDER BY CAST(`meta_value` AS DECIMAL)
需要注意的是,你所要排序的meta_value字段的值必须都是可转换成数字,否则将会出错。
二、使用MySQL绝对值函数ABS
使用MySQL绝对值函数ABS,它告诉MySQL使用绝对值来处理处理这个字段:
ORDER BY ABS(`meta_value`)