MYSQL CSV列检查是否排除

时间:2016-05-20 12:17:05

标签: 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;

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

有什么不像选项吗?我很困惑如何使这个工作。

2 个答案:

答案 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窄列,可以完全索引。