Mysql按数组查询数据使用FIND_IN_SET

时间:2012-06-21 19:45:21

标签: php mysql

表是

 CREATE TABLE `news` (
  `id` bigint(20) NOT NULL auto_increment,
  `title` varchar(255) default NULL,
  `tagkey` text NOT NULL,
  PRIMARY KEY  (`id`)
) ;

INSERT INTO `news` VALUES (1, 'TITLE1','3D');
INSERT INTO `news` VALUES (2, 'TITLE2 ','cat');
INSERT INTO `news` VALUES (3, 'TITLE2','BOOKs,3D');
INSERT INTO `news` VALUES (4, 'TITLE1','3D,DOG');
INSERT INTO `news` VALUES (5, 'TITLE2 ','DOG');
INSERT INTO `news` VALUES (6, 'TITLE2','BOOKs,DOG');
INSERT INTO `news` VALUES (7, 'TITLE1','Wolf,DOG');
INSERT INTO `news` VALUES (8, 'TITLE2 ','cat,DOG');
INSERT INTO `news` VALUES (9, 'TITLE2','BOOKs,cat');

todo查询' cat',预订。我使用了这个查询。但无法搜索正确的数据。

  select * FROM news WHERE tagkey IN ('book','cat')      
    $list = array('cat','DOG');
    $list = array_map('apply_quotes', $list);
    $query = "select * FROM news 
    WHERE tagkey IN (" . join(',', $list) . ") AND id <> $id";

2 个答案:

答案 0 :(得分:3)

我会猜测你想要查询某些内容LIKE

SELECT * 
FROM news 
WHERE tagkey LIKE '%cat%' OR tagkey LIKE '%book%'

但您应该认真考虑规范化数据库,而不是将列表存储在一列中。

或者正如Marc在评论FIND_IN_SET(str,strlist)

中所建议的那样

请参阅SQL Fiddle for Demo

SELECT * 
FROM news  
WHERE FIND_IN_SET('book', tagkey)
  OR FIND_IN_SET('cat', tagkey)

答案 1 :(得分:1)

我最好的答案是不要那么做,有很多'为什么',其中一些:

  • 你失去了性能,依赖性,可扩展性,原子性,隔离性,一致性,除此之外,会有一些简单的问题,你会让它变得更复杂,结论你做错了,但是你能做什么? / LI>

我建议您根据基数创建关系表,并将不同行中的项目分开,创建索引和Voila!。

请看一下这个链接,这将有助于您将来提高自己的技能。