MYSQL CSV 列检查排除
MYSQL CSV column check for exclude
我需要查找在 CSV 列中没有特定值的记录。下面是 table 结构
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
我需要找到标签为 "sports,soccer,baseball" 的员工姓名,不包括 cricket
所以结果应该 return 在这个例子中只有第二条和第三条记录,因为它们没有 51(板球)但所有其他 3 条虽然在差异模式中。
我的查询在下面,但我无法再让它工作了。
SELECT t.first_name,FROM `User` `t` WHERE (keywords like '50,52,53') LIMIT 10
有什么不像unlike选项吗?我很困惑如何让它工作。
您可以使用 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;
请记住,它可能会很慢。正确的方法是规范化您的 table 结构。
FIND_IN_SET will do the job for you but it does not use indexes. This is not a bug it's a feature.
SUBSTRING_INDEX can use an index and return the data as you wish. You don't have an index on it at the moment, But the catch here is that TEXT fields cannot be fully indexed 而您拥有的是一个 TEXT 字段。
标准化!
这才是你真正应该做的。在数据库中存储逗号分隔值不是一个好主意。你真的应该有一个关键字 table,因为关键字会很短,你可以有一个 char 或 varchar 窄列,它可以被完全索引。
我需要查找在 CSV 列中没有特定值的记录。下面是 table 结构
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
我需要找到标签为 "sports,soccer,baseball" 的员工姓名,不包括 cricket 所以结果应该 return 在这个例子中只有第二条和第三条记录,因为它们没有 51(板球)但所有其他 3 条虽然在差异模式中。
我的查询在下面,但我无法再让它工作了。
SELECT t.first_name,FROM `User` `t` WHERE (keywords like '50,52,53') LIMIT 10
有什么不像unlike选项吗?我很困惑如何让它工作。
您可以使用 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;
请记住,它可能会很慢。正确的方法是规范化您的 table 结构。
FIND_IN_SET will do the job for you but it does not use indexes. This is not a bug it's a feature.
SUBSTRING_INDEX can use an index and return the data as you wish. You don't have an index on it at the moment, But the catch here is that TEXT fields cannot be fully indexed 而您拥有的是一个 TEXT 字段。
标准化!
这才是你真正应该做的。在数据库中存储逗号分隔值不是一个好主意。你真的应该有一个关键字 table,因为关键字会很短,你可以有一个 char 或 varchar 窄列,它可以被完全索引。