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`)

时间: 2024-11-02 15:16:11

MySql数字字符串类型的字段排序问题的相关文章

MySQL关于字符串中数字排序的问题分析_Mysql

本文实例讲述了MySQL关于字符串中数字排序的问题.分享给大家供大家参考,具体如下: MySQL字符串相信大家都不陌生,在MySQL字符串排序时经常会遇到一些问题,比如下面要介绍的这个 今天解决了一个关于MySQL字符串排序的很奇怪的问题,在数据里面定义的是varchar类型,实际存放的是Int类型的数据,按一下查询语句进行排序: 将字段*1或者+0可以将MySQL字符串字段按数值排序 如: select * from table where 1 order by id*1 desc; 或者 s

MySQL数字类型int与tinyint、float与decimal如何选择

最近在准备给开发做一个mysql数据库开发规范方面培训,一步一步来,结合在生产环境发现的数据库方面的问题,从几个常用的数据类型说起. int.tinyint与bigint 它们都是(精确)整型数据类型,但是占用字节数和表达的范围不同.首先没有这个表就说不过去了: Type Storage Minimum Value Maximum Value (Bytes) (Signed/Unsigned) (Signed/Unsigned) TINYINT 1 -128 127 0 255 SMALLINT

mysql数字排序问题。

问题描述 mysql数字排序问题. 数据库为:mysql 现有表 t_table ,字段 c_column:c_column的取值范围是1,2,3. 要求排序后的结果是:1,1,1,3,3,2,2,2,2这种结构,排序怎么写? 解决方案 没看懂你干嘛,复合查询就好了, 解决方案二: create table tbl ( id bigint not null primary key, fieldValue bigint not null ) insert into tbl (id, fieldVa

mysql 的列类型,增加更新表字段

#列类型 mysql 三大列类型 数值型 tinyint 占据空间 1字节 8个位 存储范围,-128-127,0-255 0-2^8 0-255 -2^7 2^7-1 smallint mediuint int bigint int系列声明时的参数 (M) unsigned zerofill 分析M参数 M表示补0宽度 M必须和zerofill配合才有意义, zerofill 表示的unsigned alter table calss add snum smallint(5) zerofill

Oracle中,将VARCHAR2类型的字符串写入BLOB类型的字段中

oracle|字符串 1.在数据库中建一个新表用于测试.CREATE TBALE TB_TEST (    ID NUMBER,    BLB BLOB);COMMIT; 2.往TB_TEST表中插入一条新记录用于测试.INSERT INTO TB_TEST VALUES(1, EMPTY_BLOB());COMMIT;注:往有BLOB类型的字段的数据表中插入新记录,不能直接填入值,必须先往BLOB字段插入一个EMPTY_BLOB(),然后再用DBMS_LOB.WRITE函数写入BLOB的值.

MySQL两个字段排序问题

问题描述 MySQL两个字段排序问题 SELECT prod_price,prod_name FROM products ORDER BY prod_price,prod_name DESC; 为什么显示的结果是按 prod_price 来进行升序排序? 这是数据库中的products表格 这是运行结果(用的Navicat for MySQL): 解决方案 mysql 多字段排序 问题mysql两个字段进进行排序mysql 按中文字段排序 解决方案二: prod_price,prod_name

spring hibernate jpa 用findAll的时候,取出的所有的string类型的字段都是空字符串

问题描述 spring hibernate jpa 用findAll的时候,取出的所有的string类型的字段都是空字符串 但数据库中是有值的,int值可以选出{""id"":18187no"":""""parent_id"":11654name"":""""route"":"""

MySQL中字符串与Num类型拼接报错的解决方法_Mysql

发现问题 图片地址如下 yun_qi_img/1473574486942944.jpg 需要实现的效果是要加上尺寸,如以下效果 yun_qi_img/1473574486942944.jpg|1200*675 一开始想当然使用 UPDATE tag_group SET cover = cover + '|1200*675' WHERE id = 1; 结果报错 Data truncation: Truncated incorrect DOUBLE value: 'yun_qi_img/14735

【MySQL】bit 类型引发的故事

    对一个表进行创建索引后,开发报告说之前可以查询出结果的查询在创建索引之后查询不到结果: mysql> SELECT count(*) FROM `node` WHERE uid='1655928604919847' AND is_deleted='0'; +----------+ | count(*) | +----------+ |        0     | +----------+ 1 row in set, 1 warning (0.00 sec) 而正确的结果是 mysql>