场景是这样的:在表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 ......)这显然是个问题。
答案 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,%';
这些都不能使用索引。拥有一个单独的表,每个实体和每个标签有一行是正确的方法(但我想你已经知道了)。