MYSQL CSV列检查是否排除

MYSQL CSV列检查是否排除,mysql,sql,csv,sql-like,Mysql,Sql,Csv,Sql Like,我需要找到一个在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; Samp

我需要找到一个在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
我需要找到标有“运动、足球、棒球”标签的员工姓名,不包括板球 因此,在本例中,结果应该只返回第二和第三条记录,因为它们没有51条记录(板球记录),但所有其他3条记录都是不同的模式

我的问题在下面,但我再也做不到了

SELECT t.first_name,FROM `User` `t` WHERE (keywords like '50,52,53') LIMIT 10

有没有类似的选择?我不知道该如何工作。

您可以使用
在集合中查找:

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;

请记住,它可能会很慢。正确的方法是规范化您的表结构。

您可以使用
FIND\u IN\u 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;
请记住,它可能会很慢。正确的方法是规范化表结构。

将为您完成这项工作,但它不使用索引。这不是一个bug,这是一个错误

可以使用索引并根据需要返回数据。目前还没有索引,但这里的问题是,你有一个文本字段

正常化

这才是你真正应该做的。在数据库中存储逗号分隔的值不是一个好主意。你真的应该有一个关键字表,因为关键字很短,你可以有一个char或varchar窄列,它可以被完全索引。

将为你做这项工作,但它不使用索引。这不是一个bug,这是一个错误

可以使用索引并根据需要返回数据。目前还没有索引,但这里的问题是,你有一个文本字段

正常化


这才是你真正应该做的。在数据库中存储逗号分隔的值不是一个好主意。你真的应该有一个关键字表,因为关键字很短,你可以有一个可以完全索引的char或varchar窄列。

不要将数据存储为逗号分隔的项目!这只会给你带来很多麻烦。不要将数据存储为逗号分隔的项目!这只会给你带来很多麻烦。