我为我的网页制作了标签系统,并有三个表格:
选择具有给定标签的所有项目非常简单:
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";
问题是,如果我想选择所有带有多个标签的项目,我该怎么办,例如,查找标记为猫和动物的所有项目?
我考虑过制作临时桌子,插入带有第一个标签的所有物品,然后留下带有第二个标签的物品,然后是第三个,然后是第四个等等,但它看起来并不太好和太快
答案 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"
);