今天給問說網添加一個排行榜的功能,主要就是列出了在本博客中閱讀最多和評論最多的文章,但是卻遇到了一個問題,閱讀浏覽量儲存的字段類型是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`)