Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询:将逗号分隔的值与包含逗号分隔字符串的列匹配_Mysql - Fatal编程技术网

MySQL查询:将逗号分隔的值与包含逗号分隔字符串的列匹配

MySQL查询:将逗号分隔的值与包含逗号分隔字符串的列匹配,mysql,Mysql,我有一个用户表,其中包含一个列(比如兴趣),以逗号分隔的兴趣ID作为值。 e、 g 现在,我有一个字符串,其值以逗号分隔为“13,15” 我想从上表中获取具有兴趣13,15的用户,这意味着它应该返回用户A、B和C,因为用户A包含两个兴趣(13,15),用户B将兴趣与15匹配,用户将兴趣与13匹配 什么是SQL,因为我的表中有很多用户。如果您希望获得基于松散匹配的结果,则可以执行以下查询: 松散匹配意味着在搜索“13,15”时也会出现兴趣爱好,如135151 SET @inputInterest

我有一个用户表,其中包含一个列(比如兴趣),以逗号分隔的兴趣ID作为值。 e、 g

现在,我有一个字符串,其值以逗号分隔为“13,15”

我想从上表中获取具有兴趣13,15的用户,这意味着它应该返回用户A、B和C,因为用户A包含两个兴趣(13,15),用户B将兴趣与15匹配,用户将兴趣与13匹配


什么是SQL,因为我的表中有很多用户。

如果您希望获得基于松散匹配的结果,则可以执行以下查询:

松散匹配意味着在搜索“13,15”时也会出现兴趣爱好,如
135151

SET @inputInterest := "13,15";

SELECT 
*
FROM userinterests
WHERE interests REGEXP REPLACE(@inputInterest,',','|');
对于给定的数据,您将得到如下输出:

| ID | user |   interests |
|----|------|-------------|
|  1 |    A |    12,13,15 |
|  2 |    B | 10,11,12,15 |
|  3 |    C |        9,13 |

编辑:

如果您想要基于至少有一种兴趣的结果,那么您可以使用正则表达式,如本答案中提到的@Andrew:

以下是我根据他的见解修改的查询:

SET @inputInterest := "13,15";

SELECT 
*
FROM userinterests
WHERE interests REGEXP CONCAT('(^|,)(', REPLACE(@inputInterest, ',', '|'), ')(,|$)')

注意:

您需要用输入字符串替换
@inputInterest
变量

建议:


如果希望根据松散匹配获得结果,则可以按照以下查询进行操作:

松散匹配意味着在搜索“13,15”时也会出现兴趣爱好,如
135151

SET @inputInterest := "13,15";

SELECT 
*
FROM userinterests
WHERE interests REGEXP REPLACE(@inputInterest,',','|');
对于给定的数据,您将得到如下输出:

| ID | user |   interests |
|----|------|-------------|
|  1 |    A |    12,13,15 |
|  2 |    B | 10,11,12,15 |
|  3 |    C |        9,13 |

编辑:

如果您想要基于至少有一种兴趣的结果,那么您可以使用正则表达式,如本答案中提到的@Andrew:

以下是我根据他的见解修改的查询:

SET @inputInterest := "13,15";

SELECT 
*
FROM userinterests
WHERE interests REGEXP CONCAT('(^|,)(', REPLACE(@inputInterest, ',', '|'), ')(,|$)')

注意:

您需要用输入字符串替换
@inputInterest
变量

建议:


正如@1000111所说,可以用regexp完成,但要用更复杂的regexp。看看这个,例如:

(^|,)(13|15)(,|$)
这将不匹配135中的13,或13中的1,依此类推。例如,对于数字13,这将匹配下一个字符串:

1,13,2
13,1,2
1,13
13,2
13
但不会匹配这些

1,135,2
131,2
1,113
这是一个问题:

SET@search='13,15';
挑选*
从测试
其中兴趣REGEXP CONCAT(“(^ |,)(”,REPLACE(@search,“,”,“|”),“)(,|$)”

正如@1000111所说,可以用regexp完成,但要用更复杂的regexp。看看这个,例如:

(^|,)(13|15)(,|$)
这将不匹配135中的13,或13中的1,依此类推。例如,对于数字13,这将匹配下一个字符串:

1,13,2
13,1,2
1,13
13,2
13
但不会匹配这些

1,135,2
131,2
1,113
这是一个问题:

SET@search='13,15';
挑选*
从测试
其中兴趣REGEXP CONCAT(“(^ |,)(”,REPLACE(@search,“,”,“|”),“)(,|$)”

将值存储为csv是非常糟糕的数据库设计。了解规范化。将值存储为csv是非常糟糕的数据库设计。了解正常化。我可以知道否决的原因吗?否决。这在一般情况下不起作用。如果我们需要搜索兴趣“1,2”,该怎么办?将找到1、10、11、12、22等。感谢您指出这一点。我只是想直截了当的办法@安德烈:你说得对。我根据Andrew@AndrewMay指出的缺陷编辑了我的答案。我知道投反对票的原因吗?投反对票。这在一般情况下不起作用。如果我们需要搜索兴趣“1,2”,该怎么办?将找到1、10、11、12、22等。感谢您指出这一点。我只是想直截了当的办法@安德烈:你说得对。我已经根据Andrew@AndrewThanks指出的缺陷编辑了我的答案,拯救我的一天谢谢,拯救我的一天