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) )
原文地址:https://www.cnblogs.com/bushui/p/13457379.html