MySQL查询:将逗号分隔的值与包含逗号分隔字符串的列匹配
我有一个用户表,其中包含一个列(比如兴趣),以逗号分隔的兴趣ID作为值。 e、 g 现在,我有一个字符串,其值以逗号分隔为“13,15” 我想从上表中获取具有兴趣13,15的用户,这意味着它应该返回用户A、B和C,因为用户A包含两个兴趣(13,15),用户B将兴趣与15匹配,用户将兴趣与13匹配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
什么是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指出的缺陷编辑了我的答案,拯救我的一天谢谢,拯救我的一天