萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySql數字字符串類型的字段排序問題

MySql數字字符串類型的字段排序問題

在mysql中字符串排序對於很多朋友來就都不太明白了,今天我們要介紹的是數字字符串類型的字段排序的問題與方法,希望能夠幫助到各位。


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

copyright © 萬盛學電腦網 all rights reserved