2011-05-07 129 views
0

我有一个客户表,其中有一个字段“类别”。它是一个字符串,用逗号除以逗号,例如1,11,14,21sql查询 - 从字符串获取id的正确方法?

假设我想查询所有具有categoryID 1的客户 - 查询它的正确方法是什么?

的问题是,ID 1可在开始,中间或字符串的结尾,甚至是唯一的ID,所以我不得不覆盖所有的情况下,像:

WHERE categories LIKE '1' 
    OR categories LIKE '1%,' 
    OR categories LIKE '%,1,%' 
    OR categories like '%,1' 

有一个更优雅(可能更快)的方式来做到这一点?

+2

对于什么数据库?真正的解决方案是**不**存储这样的信息,并使用适当的多对多表格设置。 – 2011-05-07 15:30:46

回答

3

您应该改为拥有CustomerID,CategoryID列的CustomerCategories表,然后每个客户类别都有一个条目。这是更容易查询 - 并且是非常非常高的关系数据库的规范。

在字符串中存储ID的数组是非关系的,因为你发现它是一个噩梦来查询。

+1

甚至不是“更多的规范”,而是“规范”。 – Amadan 2011-05-07 15:32:09

+0

@Amadan - 正式更新! – 2011-05-07 15:33:32

+0

大家好。事实上,它是.. – Amadan 2011-05-07 15:37:01

2

你应该掐死设计数据库的人来这样工作。我永远不能想到你应该在一个字段中分隔数据的情况。

在这一点上,我认为这将是一个适合你的解决方法。

WHERE ','+[categories]+',' LIKE '%,1,%' 
+0

慢,由于没有任何指数的好处。 – Amadan 2011-05-07 15:36:48

+0

@Amadan:哦,我确定它效率特别低......但数据存储的方式也是如此。 – Ryan 2011-05-07 15:37:40

+0

对,对不起,我可能不清楚。这不是对你的批评,而是对这种方法的批评。我感到自由,如果OP选择了这种方法,他应该知道其影响。我完全同意你写的所有内容。 – Amadan 2011-05-07 15:40:14