我的数据库中有产品表
产品表结构:
product_id | testid
------------------------------------
1 11,12,13
2 2,4
下面是我的FIND_IN_SET
查询:
SELECT product_id FROM product
WHERE FIND_IN_SET(3, testid) > 0;
0
下面是我的LOCATE
查询:
SELECT product_id FROM product
WHERE LOCATE(3, testid) > 0;
1
我的问题
FIND_IN_SET
和LOCATE
的区别是什么?在column
中查找id的最佳方法是什么
用简单的技术术语(PHP术语)来说,find_in_set就像PHP的子字符串函数。它将接受子字符串和字符串作为参数,如果在字符串中找到子字符串,则返回1。如果没有找到子字符串,它将返回0。
相反,LOCATE()返回字符串在字符串中第一次出现的位置。它接受子字符串和字符串作为参数。
我认为在你的用例中,find_in_set是你应该去的。因为就是这个。如果在一行中找到3,Find_in_set将返回1,其中as locate将在字符串中首先出现3,即使它找到31或300作为第一个元素。
LOCATE()
与FIND_IN_SET()
功能差异
当对整数使用LOCATE()
函数时,假设我们需要从LOCATE()
返回1,如果整数3在集合1,2,3,4,5,..
中,则可以编写以下MySQL命令:
mysql> SELECT IF(LOCATE(3,'1,2,3,4,5,6,7,8,9')>0,1,0);
+-----------------------------------------+
| IF(LOCATE(3,'1,2,3,4,5,6,7,8,9')>0,1,0) |
+-----------------------------------------+
| 1 |
+-----------------------------------------+
1 row in set (0.06 sec)
上面的命令正常工作,因为集合包含数字3,但是如果我们写下面的命令,看看会发生什么
mysql> SELECT IF(LOCATE(3,'11,12,13,14,15')>0,1,0);
+--------------------------------------+
| IF(LOCATE(3,'11,12,13,14,15')>0,1,0) |
+--------------------------------------+
| 1 |
+--------------------------------------+
1 row in set (0.02 sec)
上面的3在给定集合中不作为数字3(3)出现,尽管LOCATE()
返回1。为了避免这种情况,您可以使用FIND_IN_SET()
函数。下面是示例:
mysql> SELECT IF(FIND_IN_SET(3,'11,12,13,4,5,6,7,8,9')>0,1,0);
+-------------------------------------------------+
| IF(FIND_IN_SET(3,'11,12,13,4,5,6,7,8,9')>0,1,0) |
+-------------------------------------------------+
| 0 |
+-------------------------------------------------+
1 row in set (0.05 sec)
所以,LOCATE()函数非常适合字符串,但不太适合整数。
示例,学分和一些更多的信息,你可以在这里找到
所以在你的例子中,FIND_IN_SET
返回0
,因为在给定的集合中没有3
,但是LOCATE()
返回1
,它将给定的集合视为字符串而不是逗号分隔的值,3
出现在数字13