find_in_set和and locate之间的区别

时间:2016-11-14 05:27:57

标签: mysql

我的数据库中有产品表

产品表结构:

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_SETLOCATE之间的区别是什么?column

中查找ID的最佳方式是什么?

2 个答案:

答案 0 :(得分:5)

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

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

我认为在你的用例中,find_in_set是你应该去的那个。因为这是一个。如果连续找到3,则find_in_set将返回1,其中,即使找到31或300作为第一个元素,locate将首先在字符串中出现3。

答案 1 :(得分:4)

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)

上面的命令正常工作,因为该集合包含数字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)

虽然LOCATE()返回1,但在给定集合中,3以上不是第三(3)。 要避免这种情况,您可以使用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()函数非常适合字符串,但不适合整数。

您可以找到示例,信用和更多信息here

因此,在您的示例中FIND_IN_SET返回0,因为给定集中没有3,但LOCATE()返回1它会将给定集视为字符串但不是逗号分隔值,3中存在13