我的数据库中有产品表
产品表结构:
product_id | testid
------------------------------------
1 11,12,13
2 2,4
Run Code Online (Sandbox Code Playgroud)
以下是我的FIND_IN_SET查询:
SELECT product_id FROM product
WHERE FIND_IN_SET(3, testid) > 0;
Run Code Online (Sandbox Code Playgroud)
产量
0
Run Code Online (Sandbox Code Playgroud)
以下是我的LOCATE查询:
SELECT product_id FROM product
WHERE LOCATE(3, testid) > 0;
Run Code Online (Sandbox Code Playgroud)
产量
1
Run Code Online (Sandbox Code Playgroud)
我的问题
是的区别是什么FIND_IN_SET和LOCATE什么是找到ID的最佳方式column
用简单的技术术语(PHP术语)来说,find_in_set类似于PHP的子字符串函数。它将接受子字符串和字符串作为参数,如果在字符串中找到子字符串,则返回1。如果未找到子字符串,它将返回0。
相反,LOCATE()返回字符串中字符串首次出现的位置。它接受一个子字符串和一个字符串作为参数。
我认为在您的用例中,find_in_set是您应该使用的一种。因为这是一个。如果在一行中找到3,则find_in_set将返回1;在locate中,即使字符串中找到31或300作为第一个元素,它也会在字符串中首先出现3。
LOCATE()和FIND_IN_SET()功能的区别
当使用LOCATE()整数函数时,假设我们需要返回 1,LOCATE()如果整数 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)
Run Code Online (Sandbox Code Playgroud)
上面的命令可以正常工作,因为集合包含数字 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)
Run Code Online (Sandbox Code Playgroud)
尽管返回 1 ,但上面的 3 并不作为给定集合中的数字三(3) 出现。LOCATE()为避免这种情况,您可以使用该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)
Run Code Online (Sandbox Code Playgroud)
因此,LOCATE() 函数非常适合字符串,但不太适合整数。
您可以在此处找到示例、制作人员名单和更多信息
因此,在您的示例中FIND_IN_SET返回,因为给定的集合中0没有,但返回它将给定的集合视为字符串而不是逗号分隔的值,并且存在于数字中3LOCATE()1313