我有一个用户表,其中包含一个以逗号分隔的兴趣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是什么,因为我的表中有很多用户。
答案 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 |
修改强>
如果您希望结果基于至少具有一个兴趣,那么您可以使用正则表达式作为答案中提到的@Andrew:
我已经根据他的洞察力修改了我的查询:
SET @inputInterest := "13,15";
SELECT
*
FROM userinterests
WHERE interests REGEXP CONCAT('(^|,)(', REPLACE(@inputInterest, ',', '|'), ')(,|$)')
注意:强>
您需要用输入字符串替换@inputInterest
变量。
<强>建议:强>
Is storing a delimited list in a database column really that bad?