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

时间:2016-05-11 06:02:39

标签: mysql

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

user  interests
A     12,13,15
B     10,11,12,15
C     9,13
D     10,12

现在,我有一个逗号分隔值的字符串为" 13,15"。

我想从上面的表中获取有兴趣13,15的用户意味着它应该返回用户A,B& C作为用户A包含兴趣(13,15),用户B将兴趣与15&用户将兴趣与13匹配。

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

2 个答案:

答案 0 :(得分:8)

可以使用regexp来完成,因为@ 1000111说,但是有更复杂的正则表达式。看看这个,例如:

(^|,)(13|15)(,|$)

这与13中的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';

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

答案 1 :(得分:2)

如果您想根据松散匹配得到结果,那么您可以按照以下查询:

松散匹配意味着在搜索' 13,15'时会出现135,151等兴趣。

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 |

SQL FIDDLE DEMO

修改

如果您希望结果基于至少具有一个兴趣,那么您可以使用正则表达式作为答案中提到的@Andrew:

我已经根据他的洞察力修改了我的查询:

SET @inputInterest := "13,15";

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

SEE DEMO OF IT

注意:

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

<强>建议:

Is storing a delimited list in a database column really that bad?