在項目中遇到了産品的分類,類别較多并且可以多選,此種情況的查詢 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')
結果如下:
實質上find_in_set()查詢的是字元串1在字元串2(逗号隔開)中的位置,不存在則傳回false(0)
2、find_in_set()在where中的使用與使用範圍
SELECT * FROM test WHERE FIND_IN_SET(,type)
此時查詢的結果正确
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中有
查詢: