find_in_set和and locate之间的区别

Nik*_*ela 6 mysql

我的数据库中有产品表

产品表结构:

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_SETLOCATE什么是找到ID的最佳方式column

use*_*262 5

用简单的技术术语(PHP术语)来说,find_in_set类似于PHP的子字符串函数。它将接受子字符串和字符串作为参数,如果在字符串中找到子字符串,则返回1。如果未找到子字符串,它将返回0。

相反,LOCATE()返回字符串中字符串首次出现的位置。它接受一个子字符串和一个字符串作为参数。

我认为在您的用例中,find_in_set是您应该使用的一种。因为这是一个。如果在一行中找到3,则find_in_set将返回1;在locate中,即使字符串中找到31或300作为第一个元素,它也会在字符串中首先出现3。


S.I*_*.I. 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