Thinkphp 查询varchar的最大值,MYSQL中FIND_IN_SET()函数的使用
如果我们直接使用max获取varchar的最大值,很多时候我们获取正确的值。在这之前我们要先了解CAST 和 CONVERT 转化类型的函数,这样我们获取的的最大值就不是“999”。
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、使用Thinkphp6中获取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 = Customer::orderRaw("CAST(code AS UNSIGNED) desc")->select();
注意:code字段是varchar类型,如果直接使用order,不会得到正确的结果的
MySql:
SELECT * FROM customer ORDER BY CAST(code AS UNSIGNED) desc
MYSQL中FIND_IN_SET()函数的使用
这篇博客比较详细,大家自己去看:
https://www.cnblogs.com/lixinjun8080/p/11246632.html
我叫简单介绍一下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的使用:
Activity::whereRaw("FIND_IN_SET(1,participants)")->column("id");
转成MySql:
SELECT `id` FROM `activity` WHERE ( FIND_IN_SET(1,participants) )