天天看點

mySql 下查詢 find_in_set 與 like 的差別與應用場景, symfony 如何使用find_in_set()find_in_set()使用範圍:find_in_set()适用于字段中含有多個值且值與值之間使用逗号隔開的情況

在項目中遇到了産品的分類,類别較多并且可以多選,此種情況的查詢 like 并不适用,查詢後使用 find_in_set(),對like 與find_in_set()做了淺顯的研究。

查詢type為1的資料,簡略表如下:

id type
1 1,2,3
2 2,8,9
3 3,10,11

一、like 查詢的限制

like查詢:

查詢到的資料為:

id type
1 1,2,3
3 3,10,11

顯然此時是不合理的,合理的結果應該隻有id=1的資料。

原因

like 是模糊查詢,在前後均有通配符‘%’的情況下,查詢的資料隻要含有‘1’就會被輸出

二、FIND_IN_SET()

1、查詢 find_in_set()的輸出

SELECT FIND_IN_SET(,'1,2,3')
           

結果如下:

mySql 下查詢 find_in_set 與 like 的差別與應用場景, symfony 如何使用find_in_set()find_in_set()使用範圍:find_in_set()适用于字段中含有多個值且值與值之間使用逗号隔開的情況
mySql 下查詢 find_in_set 與 like 的差別與應用場景, symfony 如何使用find_in_set()find_in_set()使用範圍:find_in_set()适用于字段中含有多個值且值與值之間使用逗号隔開的情況

實質上find_in_set()查詢的是字元串1在字元串2(逗号隔開)中的位置,不存在則傳回false(0)

2、find_in_set()在where中的使用與使用範圍

SELECT * FROM test WHERE FIND_IN_SET(,type)
           
mySql 下查詢 find_in_set 與 like 的差別與應用場景, symfony 如何使用find_in_set()find_in_set()使用範圍:find_in_set()适用于字段中含有多個值且值與值之間使用逗号隔開的情況

此時查詢的結果正确

find_in_set()使用範圍:find_in_set()适用于字段中含有多個值且值與值之間使用逗号隔開的情況

三、symfony下使用FIND_IN_SET()

symfony(doctrine)的函數并不支援find_in_set,需要引入第三方bundle:

并在配置檔案内引入函數:

symfony4:..\config\packages\doctrine.yml

引用函數内容在../vendor/beberlei/DoctrineExtensions/config/mysql.yml中有

mySql 下查詢 find_in_set 與 like 的差別與應用場景, symfony 如何使用find_in_set()find_in_set()使用範圍:find_in_set()适用于字段中含有多個值且值與值之間使用逗号隔開的情況

查詢:

注意:在symfony(doctrine)内必須跟 !=0, 或者 >=0, 因為上文提過實質查詢的是字元串2在1中的位置,否則會報錯