-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%'

ただし、データベースを正規化し、リストを 1 つの列に格納しないことを真剣に検討する必要があります。

または、マークがコメント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 に答える