首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据逻辑找到关联,而不是逻辑OR

根据逻辑找到关联,而不是逻辑OR
EN

Stack Overflow用户
提问于 2017-02-10 05:20:59
回答 3查看 39关注 0票数 0

在我的数据模型中,一张照片可以有许多与它相关的标签。

所以我的photos桌子上有两张照片。

代码语言:javascript
运行
复制
 id | file_name
----+----------------------
  1 | DSCN0317.jpg
  2 | DSCN0291.jpg

我的tags表有两个标签

代码语言:javascript
运行
复制
 id |      name
----+----------------
  5 | Vacation
  6 | Work

我有张映射表把两个绑在一起。

代码语言:javascript
运行
复制
   photo_id | tag_id
----------+--------
        1 |      5
        2 |      5
        2 |      6

所以在这个例子中,照片1有一个标签(5),照片2有多个标签(5,6)。

在我的应用程序中,我需要找到带有特定标签列表的所有照片。更重要的是,如果可能的话,我需要在一个查询中这样做。

(关于为什么需要一个查询的推理超出了这个问题的范围,并且与我的应用程序的具体实现有关)。

例如,我想“找到所有同时有标签5和6的照片”。

代码语言:javascript
运行
复制
SELECT DISTINCT "photos".*
FROM "photos"
INNER JOIN "photo_tags"
  ON "photo_tags"."photo_id" = "photos"."id"
WHERE "photo_tags"."tag_id" IN (5, 6)
;

但是这个查询是不正确的,因为它返回所有标签为6或7的照片。我正在寻找有6和7的照片。

有什么方法可以将上面的查询转换成这样吗?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-10 12:31:39

在加入之前,将标记聚合到数组中。然后检查所需的标记是否由数组包含:

代码语言:javascript
运行
复制
select distinct photos.*
from
    photos
    inner join (
        select photo_id as id, array_agg(tag_id) as tags
        from photo_tags
        group by photo_id
    ) photo_tags using(id)
where array[5, 6] <@ tags
票数 1
EN

Stack Overflow用户

发布于 2017-02-10 05:26:17

使用聚合和条件独立计数(Tag_id)尝试这样做:

代码语言:javascript
运行
复制
select p.*
from photos p
join (
    select 
        photo_id
    from tags
    where 
        tag_id in (5, 6)
    group by 
        photo_id
    having 
        count(distinct tag_id) = 2
) t on p.id = t.photo_id;

或相关查询:

代码语言:javascript
运行
复制
select p.*
from photos p
where exists (
    select
        1
    from tags t
    where
        t.tag_id in (5, 6)
        and t.photo_id = p.id
    group by 
        id
    having 
        count(distinct tag_id) = 2
);
票数 1
EN

Stack Overflow用户

发布于 2017-02-10 05:26:24

您可以使用EXISTS查找具有ID 5和ID 6的照片:

代码语言:javascript
运行
复制
SELECT "photos".*
FROM "photos"
WHERE EXISTS (
    SELECT "photo_tags"."tag_id" 
    FROM "photo_tags" 
    WHERE "photo_tags"."photo_id" = "photos"."id" 
        AND "photo_tags"."tag_id" = 5)
AND EXISTS (
    SELECT "photo_tags"."tag_id" 
    FROM "photo_tags" 
    WHERE "photo_tags"."photo_id" = "photos"."id" 
        AND "photo_tags"."tag_id" = 6)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42152043

复制
相关文章

相似问题

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