【问题标题】:MySQL Query : Match comma separated value with column containing comma separted stringMySQL查询:将逗号分隔值与包含逗号分隔字符串的列匹配
【发布时间】:2016-05-11 06:02:39
【问题描述】:

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

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,因为我的表中有很多用户。

【问题讨论】:

  • 将值存储为 csv 是非常糟糕的数据库设计。了解标准化。

标签: mysql


【解决方案1】:

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

(^|,)(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';

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

【讨论】:

  • 谢谢,拯救我的一天
【解决方案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?

【讨论】:

  • 我可以知道投反对票的原因吗?
  • 投反对票。这在一般情况下不起作用。如果我们需要搜索兴趣“1,2”怎么办?将找到 1、10、11、12、22 等。
  • 感谢您指出这一点。我只是想到了直截了当的方法。 @安德鲁
  • 你是对的。我根据 Andrew @Andrew 指出的缺陷编辑了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多