MySQL - 选择具有多个主题标签的所有项目

时间:2015-07-16 16:55:07

标签: php mysql hashtag junction-table

我为我的网页制作了标签系统,并有三个表格:

  • 项目 - ID和其他一些
  • 标签 - ID和名称
  • item_tags - 与IDitem和IDtag的联结表

选择具有给定标签的所有项目非常简单:

SELECT items.* FROM items
join item_tags on items.ID=item_tags.IDitem
join tags on item_tags.IDtag=tags.ID
where tags.name="something";

问题是,如果我想选择所有带有多个标签的项目,我该怎么办,例如,查找标记为猫和动物的所有项目?

我考虑过制作临时桌子,插入带有第一个标签的所有物品,然后留下带有第二个标签的物品,然后是第三个,然后是第四个等等,但它看起来并不太好和太快

2 个答案:

答案 0 :(得分:1)

你知道你的清单,所以这是一个简单的字符串。而且你知道你的数量。这些可以被塞进mysql create table items ( id int not null ); create table tags ( id int not null, name varchar(50) ); create table item_tags ( iid int not null, tid int not null ); insert items (id) values (1),(2),(3),(4); insert tags(id,name) values (1,'cat'),(2,'animal'),(3,'has nose'); -- note, everything has a nose so far: insert item_tags (iid,tid) values (1,1),(1,3),(2,1),(2,3),(3,2),(3,3),(4,1),(4,2),(4,3); select i.id,count(i.id) from items i join item_tags junc on junc.iid=i.id join tags t on t.id=junc.tid and t.name in ('cat','animal') group by i.id having count(i.id)=2 -- only item 4 has both cat and animal (note nose is irrelevant) 并执行。

但低于它的是列表和计数仅仅是为了演示目的。

 <div ng-app="ang2" ng-controller="form_controller">
 <form name="registration" novalidate>
 Name:<input type = "text" ng-model="name" name="name" required>
 Contact:<input type = "text" ng-model="contact" name="contact"required>
 Email-address: <input type = "text" ng-model="emailid"   
 name="emailid"required>
 <button ng-click="refresh()">Refresh</button>
 </form>
 </div>
 <script>
  var ang2=angular.module("ang2",[]);
   ang2.controller('form_controller',function($scope){
   $scope.name='rishi';
   $scope.contact='4437577391';
   $scope.emailid='rishanthkanakadri@gmail.com';

   $scope.refresh=function(){

   $scope.name='';
   $scope.contact='';
   $scope.emailid='';
   }
  var stu= $scope.refresh();
  return stu;
   });
 </script>

答案 1 :(得分:0)

使用IN找到与两个标签匹配的所有内容。像这样:

SELECT DISTINCT items.* FROM items 
INNER JOIN item_tags on items.ID=item_tags.IDitem 
INNER JOIN tags on item_tags.IDtag=tags.ID 
WHERE tags.name="something"
AND items.* IN (
    SELECT items.* FROM items 
    INNER JOIN item_tags on items.ID=item_tags.IDitem 
    INNER JOIN tags on item_tags.IDtag=tags.ID 
    WHERE tags.name="somethingelse"
);