您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

mysql中字段类型转换排序_MySQL

2024/3/19 6:32:08发布28次查看
bitscn.com
表中字段server_id是varchar类型,现在我们查询数据时想以server_id排一下序,排序后的结果:
select server_id from cardserver where game_id = 1 order by server_id desc limit 10;
+-----------+
| server_id |
+-----------+
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 10        |
| 1         |
+-----------+
很明显,我们想要的结果应该是 10,8,7,6,5 这样的。但是这个10排在了2的后面。按照字符串来排的。其实我们是想把它当做数值来排。
手动转换类型:
用下面的方法就可以了,使server_id+0之后再排序,问题解决了。
select server_id from cardserver where game_id = 1 order by server_id+0 desc limit 10;
+-----------+
| server_id |
+-----------+
| 10        |
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 1         |
+-----------+
使用mysql函数cast/convert:
mysql为我们提供了两个类型转换函数:cast和convert,现成的东西我们怎能放过?
cast() 和convert() 函数可用来获取一个类型的值,并产生另一个类型的值。
这个类型 可以是以下值其中的 一个:
binary[(n)]
char[(n)]
date
datetime
decimal
signed [integer]
time
unsigned [integer]
所以我们也可以用cast解决问题:
select server_id from cardserver where game_id = 1 order by cast(server_id as signed) desc limit 10;
+-----------+
| server_id |
+-----------+
| 10        |
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 1         |
+-----------+
也可以使用convert来搞定此问题:
select server_id from cardserver where game_id = 1 order by convert(server_id,signed) desc limit 10;
+-----------+
| server_id |
+-----------+
| 10        |
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 1         |
+-----------+
总结:
条条大道通罗马,条条小路通我家。不管是啥方法,解决问题就是好方法。当然,既然mysql为我们提供了现成的函数。我们为何不让代码显得更漂亮些呢?呵呵。
所以mysql varchar排序推荐使用cast或convert函数。
bitscn.com
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product