我有三张桌子:
Foods表存储所有食物项目,Tags表存储所有标签,FoodTagRelation存储食物和标签之间的关系。我想编写一个查询,以选择所有带有specified Ids 的确切2个标签的食品(请阅读我在底部中编写的SQL )。
Foods Table
Id | FoodItem
----------------------
1 | Mango
2 | Custard
3 | Pizza
Tags Table
Id | TagName
----------------------
1 | Fruit
2 | Cold
3 | Hot
4 | Veg
FoodTagRelation
Id | FoodId | TagId
----------------------
1 | 1 | 1
2 | 1 | 4
3 | 2 | 1
4 | 2 | 2
5 | 2 | 4现在我想选择所有有两个标签的食物:例如,选择所有同时有标签的食物:Fruit和Cold。
我尝试了这个查询,但是它返回带有标记Fruit 或 Cold的所有食物。
select * from Foods
inner join FoodTagRelation
on
Foods.Id=FoodTagRelation.FoodId
where
tagid in ('1','2')如何重写此查询,使其只返回具有和标记的食品?
发布于 2011-09-06 19:58:53
对于一个更通用的答案,它允许您更改要搜索的标记:
DECLARE @Search_Tags TABLE (TagId INT)
INSERT INTO @Search_Tags (TagId) VALUES (1), (2)
SELECT
F.Id,
F.FoodItem
FROM
Foods F
INNER JOIN FoodTagRelation FTR ON
FTR.FoodId = F.Id
INNER JOIN @Search_Tags ST ON
ST.TagId = FTR.TagId
GROUP BY
F.Id,
F.FoodItem
HAVING
COUNT(*) = (SELECT COUNT(*) FROM @Search_Tags)发布于 2011-09-06 19:01:50
SELECT
F.id,
F.FoodItem
FROM
Foods F
INNER JOIN FoodTagRelation FTR
ON F.Id = FTR.FoodId
WHERE
FTR.tagid in('1','2')
GROUP BY
F.id,
F.FoodItem
HAVING
count(Distinct FTR.tagid) > 1特性:使用count,以防止FoodTagRelation表中给定的tagid出现重复tagid问题。(如果您不认为重复是一个问题,那么您可以删除'distinct‘关键字)。其次,我保留了WHERE子句,因为这允许您查找特定于的标记,而不是任何两个。最后,我列出了您的字段,因为这是使用group by子句所必需的(这反过来也是使用HAVING子句所必需的)。
发布于 2011-09-06 18:58:00
在FoodID上按组进行分组,并使用count(tagID) =2
select *
from foods as f inner join foodtagrelation as ftr on f.id=ftr.foodid
where (ftr.tagid = 1 or ftr.tagid = 2)
group by f.foodid
having count(*) = 2https://stackoverflow.com/questions/7324677
复制相似问题