thinkphp使用orderRaw,FIND_IN_SET来排序复杂条件

3070

1、使用 CAST:
CAST ( expression AS data_type )

 

2、使用 CONVERT:
CONVERT (data_type[(length)], expression [, style])
可以看到,convert比CAST多了bai一个style,在转化成日期类型时,因为需要格式要求,cast就不合适了,应该还有其他一些需要转化格式的,比如金钱等等,这个看看帮助就知道。

其他时候,二者实现的功能都一样。 都是转化类型的函数

 

3、 CAST和CONVERT比较

(1)cast一般更容易使用,convert的优点是可以格式化日期和数值;

(2)convert一般用于日期和时间值,小数之间转换,cast一般用于小数转数值和字符型;

(3)converk显示转换,cast是强制转换; 


4、mysql中获取varchar类型数据的最大值


-- 获取最大值
select MAX(CAST(code as SIGNED INTEGER)) from customer;
select MAX(CAST(code as UNSIGNED INTEGER)) from customer ;
-- 或
select max(Convert(code,SIGNED)) FROM from customer
select max(Convert(code,UNSIGNED)) FROM from customer
-- 也可以转化为小数
SELECT CAST(2017 as decimal(8,2));    -- 2017.00
SELECT CONVERT(2017,decimal(8,2)); -- 2017.00


signed和unsigned用于修饰整数类型。

signed表示有符号,unsigned表示无符号。对应的有符号数的最大取值要比无符号的小约一半,因为最高一位被用来表示符号。
默认的int、short、long、long long为有符号数,也就是说,int等价于signed int,short等价于signed short,long等价于signed long,long long等价于signed long long。但是char本身是signed char还是unsigned char,取决于语言的实现(编译器)。

范围列表如下:
signed char:[-2^7, 2^7)即[-128, 128);
unsigned char:[0, 2^8)即[0, 256);


5、使用Thinkphp5,6中获取varchar类型数据的最大值



$code = $model::fieldRaw("max(Convert(code,SIGNED))")->select()->toArray();
$code = $code[0]['max(Convert(code,SIGNED))'];
//或者
$code = $model::fieldRaw("max(CAST(code as SIGNED INTEGER))")->select()->toArray();
$code = $code[0]['max(CAST(code as SIGNED INTEGER))'];


6、同理,使用orderRaw进行,也不会受varchar类型影响

$items = User::orderRaw("CAST(code AS UNSIGNED) desc")->select(); //code可以是字符串

注意:code字段是varchar类型,如果直接使用order,不会得到正确的结果的

MySql:

SELECT * FROM customer ORDER BY CAST(code AS UNSIGNED) desc


7.MYSQL中FIND_IN_SET()函数的使用

FIND_IN_SET(str,strlist)

str 要查询的字符串

strlist 字段名 参数以”,”分隔 如 (1,2,6,8,10,22)

查询字段(strlist)中包含(str)的结果,返回结果为null或记录

假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 一个字符串列表就是一个由一些被 ‘,' 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,')时将无法正常运行。

在thinkphp的使用:

$participants = '1,2,3,4';
User::whereRaw("FIND_IN_SET(1,participants)")->column("id");
User::whereRaw("FIND_IN_SET(id,participants)")->column("id");