我需要在CSV列中找到没有特定值的记录。下面是表格结构
CREATE TABLE `employee` (
`id` int NOT NULL AUTO_INCREMENT,
`first_name` varchar(100) NOT NULL,
`last_name` varchar(100) NOT NULL,
`keywords` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Sample record1: 100, Sam, Thompson, "50,51,52,53"
Sample record2: 100, Wan, Thompson, "50,52,53"
Sample record3: 100, Kan, Thompson, "53,52,50"
50 = sports
51 = cricket
52 = soccer
53 = baseball
我需要找到拥有“体育,足球,棒球”标签的员工姓名不包括板球 所以结果应该只返回这个例子中的第2和第3条记录,因为它们没有51(板球)但是所有其他3但是在差异模式中。
我的查询如下,但我无法再让它工作了。
SELECT t.first_name,FROM `User` `t` WHERE (keywords like '50,52,53') LIMIT 10
有什么不像选项吗?我很困惑如何使这个工作。
答案 0 :(得分:1)
您可以使用FIND_IN_SET
:
SELECT t.first_name
FROM `User` `t`
WHERE FIND_IN_SET('50', `keywords`) > 0
AND FIND_IN_SET('52', `keywords`) > 0
AND FIND_IN_SET('53', `keywords`) > 0
AND FIND_IN_SET('51', `keywords`) = 0;
请记住它可能很慢。正确的方法是规范化表结构。
答案 1 :(得分:1)
FIND_IN_SET将为您完成这项工作,但它不会使用索引。这不是一个feature的错误。
SUBSTRING_INDEX可以使用索引并根据需要返回数据。你目前没有索引,但这里的问题是TEXT fields cannot be fully indexed,你所拥有的是一个TEXT字段。
<强>规格化强>!
这是你真正应该做的。将逗号分隔值存储在数据库中并不是一个好主意。你真的应该有一个关键字表,因为关键字很短,你可以有一个char或varchar窄列,可以完全索引。