如果列有多个逗号分隔值,我如何过滤mysql数据?

时间:2014-04-11 07:37:45

标签: mysql sql

我想问一下,如果检查具有多个逗号分隔值的列的条件,我如何过滤mysql数据。我举个例子 -

我有下表说" tbitems" -

id     item_names     item_types    item_features
1      item 1        8,6          10,5,4,9,8,6
2      item 2        8,6          10,5,8

现在假设我想获取项目类型为8或6但是item_features完全等于我们为示例10,5和4指定的记录(项目)。

我知道第一个条件(项目类型)我们可以使用IN运算符。

但我不知道如何根据item_features过滤记录。

我可以像这样编写查询 -

SELECT * FROM tbitems WHERE item_types IN (8) AND item_features` 操作员应该只选择这些价值(4,5,10)

如果我像第一个条件那样使用IN,那么上面的第二行也会被提取,因为5和10在集合中可用(10,5,8),但我想只提取第一行。有什么想法吗?

编辑 -

抱歉,您的解决方法无效。

我想只获得此表的第一行 -

enter image description here

但现在它正在产生一些我不想要的额外行。而且我不能使用这么多的FIND_IN_SET,因为逗号分隔的值可能很大。此外,我无法在我的PHP代码中使用此sql。

2 个答案:

答案 0 :(得分:3)

对于您当前的情况,您可以在每次需要匹配FIND_IN_SET时使用item_features

SELECT * FROM
table1
WHERE
item_types
IN (8) AND FIND_IN_SET(4,item_features)
AND FIND_IN_SET(5,item_features)
AND FIND_IN_SET(10,item_features) 

Fiddle Demo

  

但我问你是否有可能改变架构然后首先规范化   你的结构见Database normalization,将所有关系存储在一个单独的表中,就像item_types_relations的联结表一样,它将当前表id和联结表中的所有项id存储为一对多和item_features_relation

的相同联结表

编辑根据@ Ravinder的评论

SELECT * FROM
table1
WHERE
FIND_IN_SET(8,item_types)
AND FIND_IN_SET(4,item_features)
AND FIND_IN_SET(5,item_features)
AND FIND_IN_SET(10,item_features) 

答案 1 :(得分:1)

如果值以CSV格式存储,则必须使用FIND_IN_SET。使用IN将无效。

mysql> select * from ( select '8,6' i ) r where i in (8);
+-----+
| i   |
+-----+
| 8,6 |
+-----+
1 row in set (0.00 sec)

mysql> select * from ( select '8,6' i ) r where i in (6);
Empty set (0.00 sec)

试试这个

SELECT * FROM tbitems
WHERE  find_in_set( 8, item_types ) 
  AND  find_in_set( 4, item_features )
  AND  find_in_set( 5, item_features )
  AND  find_in_set( 10, item_features )