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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM