2016-11-14 59 views
5

我在我的数据库产品表差异,并找到

产品表结构:

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,什么是找到ID在函数整数column

回答

2

差异与LOCATE()之间LOCATE()FIND_IN_SET()功能

使用的最佳方法,区别假设我们需要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) 

了上述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回到0here

所以因为在给定的没有3,但LOCATE()返回1它处理给定的设置为一个字符串,但不逗号分隔值,并且3存在于数字13

4

简单地说就是技术术语(PHP术语),find_in_set就像PHP的子字符串函数。它将接受一个子字符串和一个字符串作为参数,并且如果在字符串中找到子字符串,则返回1。如果没有找到子字符串,它将返回0。

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

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