MySQL中的IN()是否存在“反向”函数?

时间:2014-03-30 12:59:11

标签: mysql arrays

场景是这样的:在表A中,我有一列"标签",它是varchar(255)。 在本专栏中,我存储了以逗号分隔的数字,如下所示:

2,14,31,33,56

等。没有,一个或几个。

我需要创建一个SELECT查询,该查询将返回此字段中具有特定编号的行。现在我使用这种方法(不要惊慌,我知道它很糟糕......这就是我寻求帮助的原因!)。例如,让我们假设我要检查的数字是33.查询是:

SELECT * FROM table_a WHERE
tags LIKE "%,33,%" OR tags LIKE "33,%" OR tags LIKE "%,33" OR tags LIKE "33"

我不是专家,但我知道这不是方法。我想到的第一个问题是:是否有一个类似于IN()的命令,但是反过来呢?

我的意思是,我可以告诉它"找到行标记'包含值33" ?

当提出这个问题时,我可以看到除了varchar(255)之外可能还有另一种字段类型来包含这种类型的数据(毕竟是一个数组数组)

这样做有效吗?我的方法适用于小表,是的,但如果表增长...(比如,10k行,50k,300k ......)这显然是个问题。

1 个答案:

答案 0 :(得分:2)

您想要的功能是find_in_set()

SELECT *
FROM table_a
WHERE find_in_set(33, tags) > 0;

您可以将like语句简化为:

SELECT *
FROM table_a
WHERE concat(',', tags, ',') LIKE '%,33,%';

这些都不能使用索引。拥有一个单独的表,每个实体和每个标签有一行是正确的方法(但我想你已经知道了)。