我想问一下,如果检查具有多个逗号分隔值的列的条件,我如何过滤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),但我想只提取第一行。有什么想法吗?
编辑 -
抱歉,您的解决方法无效。
我想只获得此表的第一行 -
但现在它正在产生一些我不想要的额外行。而且我不能使用这么多的FIND_IN_SET,因为逗号分隔的值可能很大。此外,我无法在我的PHP代码中使用此sql。
答案 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)
但我问你是否有可能改变架构然后首先规范化 你的结构见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 )