首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找具有两个或多个关系的行

查找具有两个或多个关系的行
EN

Stack Overflow用户
提问于 2011-09-06 18:52:48
回答 5查看 131关注 0票数 2

我有三张桌子:

Foods表存储所有食物项目,Tags表存储所有标签,FoodTagRelation存储食物和标签之间的关系。我想编写一个查询,以选择所有带有specified Ids 的确切2个标签的食品(请阅读我在底部中编写的SQL )。

代码语言:javascript
运行
复制
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

现在我想选择所有有两个标签的食物:例如,选择所有同时有标签的食物:FruitCold

我尝试了这个查询,但是它返回带有标记Fruit Cold的所有食物。

代码语言:javascript
运行
复制
select * from Foods
 inner join FoodTagRelation
 on
 Foods.Id=FoodTagRelation.FoodId
 where
 tagid in ('1','2')

如何重写此查询,使其只返回具有标记的食品?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-06 19:58:53

对于一个更通用的答案,它允许您更改要搜索的标记:

代码语言:javascript
运行
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2011-09-06 19:01:50

代码语言:javascript
运行
复制
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子句所必需的)。

票数 1
EN

Stack Overflow用户

发布于 2011-09-06 18:58:00

在FoodID上按组进行分组,并使用count(tagID) =2

代码语言:javascript
运行
复制
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(*) = 2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7324677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档