-4

表是

 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');

如何查询'猫',书。使用了这个查询。但无法搜索正确的数据。

  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";
4

2 回答 2

3

我将大胆猜测您正在寻找查询某物在哪里LIKE

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

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

或者正如马克在评论中建议的那样FIND_IN_SET(str,strlist)

请参阅SQL Fiddle 进行演示

SELECT * 
FROM news  
WHERE FIND_IN_SET('book', tagkey)
  OR FIND_IN_SET('cat', tagkey)
于 2012-06-21T19:58:07.567 回答
1

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

  • 你失去了性能、依赖性、可伸缩性、原子性、隔离性、一致性,除此之外,还有一些简单的查询会让它变得更复杂,结论你做错了,,但是你能做什么?

我会建议你根据基数创建一个关系表,并将不同行中的项目分开,创建索引,瞧!

请查看此链接,这将有助于您将来提高技能。

于 2012-06-21T20:24:35.790 回答