是否有一个「;逆;在MySQL中使用函数IN()吗?

是否有一个「;逆;在MySQL中使用函数IN()吗?,mysql,arrays,Mysql,Arrays,场景是这样的:在表a中,我有一列“tags”,即varchar(255)。 在此列中,我存储数字,用逗号分隔,如下所示: 2,14,31,33,56 等等。可以没有、一个或几个 我需要进行一个SELECT查询,该查询将返回在此字段中具有特定数字的行。现在我正在使用这种方法(不要惊慌,我知道这是一种糟糕的方法……这就是我寻求帮助的原因!)。例如,假设我要检查的数字是33。查询是: SELECT * FROM table_a WHERE tags LIKE "%,33,%" OR tags LIKE

场景是这样的:在表a中,我有一列“tags”,即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
的命令,但它的工作方式正好相反

我的意思是,我能告诉它“查找‘tags’包含值33的行”吗

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


有没有一个好的和有效的方法来做到这一点?我的方法适用于小表,是的,但是如果表增长。。(比如,10k行、50k行、300k行……)这显然是个问题。

您需要的函数是
在集合中查找()

您可以将
like
语句简化为:

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

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

您遇到的是为什么您应该规范化数据,而不是将列表存储在单个列中。这个问题对于一些价值观来说是糟糕的,当你达到任何规模时都会很糟糕。感谢你如此迅速的反应。我试试看。但是,正如您所提到的,这不能使用索引(这是我真正想要的..因为我需要快速的索引)。是的,我知道另一种方法是创建一个新表,它交叉引用了这两个内容(一个表包含列tag_id,示例的reference_id,两个列都被索引)。问题是,如果我当前的表达到了,比如说,30万行,那么假设每个表平均有10个标签。。这将给我一个300万行的交叉引用表。。。我不喜欢,它闻起来像是问题…换句话说:没有其他字段类型(不是varchar)允许ID数组,并且以某种方式索引。。。有?我要求太多了吗?;)谢谢@用户3478061。如果要使用索引,则需要使用关联/连接表以适当的格式存储数据。
SELECT *
FROM table_a
WHERE concat(',', tags, ',') LIKE '%,33,%';