【问题标题】:How do I filter values from a many to many relationship?如何从多对多关系中过滤值?
【发布时间】:2021-08-10 03:31:49
【问题描述】:

如果文章和标签之间存在多对多关系,那么选择所有包含特定用户存储的标签的文章的最佳方法是什么?

对于此示例,假设有一个包含 user_id 列的 users 表。 文章

Article_id Article_name
1 Dogs
2 Cats
3 Sheep

标签

Tag_id
Pets
Outdoors
Grass

Article_Tags

Article_id tag_id
1 Pets
1 Grass
1 Outdoors
2 Outdoors
3 Grass
3 Outdoors

Users_Tags

User_id tag_id
User1 Pets
User1 Grass
User2 Pets

如果我想在 Users_Tags 中显示具有用户存储的与其 ID 相关联的任何标签的所有文章,那么最好的方法是什么?我遇到过嵌套选择和内部连接,但我无法找出解决此问题的最佳方法。

例如,由于 User1 存储了标签 Pets 和 Grass 及其 User_id,我想返回 ID 为 1 和 2 的文章,因为这两篇文章至少有一个用户存储的标签相关联用它。

Article_id | Article_ Name |Tag_id
     1     |       Dogs    |  Pets
     1     |       Dogs    |  Grass
     3     |       Sheep   |  Grass

上面提供了一个示例输出。为了清楚起见,我包括了对同一篇文章的重复,尽管实际上我只想重复一次。

【问题讨论】:

  • 感谢@eyllanesc 的格式化帮助!我遇到了麻烦。
  • 嗨@tagger,请提供示例输出。这更好理解。
  • 我添加了一个示例输出@Rahul Biswas
  • 嗨@tagger 为什么狗等于铸件 1 不是草
  • @Rahul Biswas 对不起!我在半睡半醒的时候进行了编辑。它应该等于草。

标签: postgresql


【解决方案1】:

如果我没记错的话,它应该是带有“内连接”的序数结构。看起来,“Tag_Id”列包含打印错误,因为“Tags”表没有“Cats”值。

Select A.Article_id, A.Article_name, U.Tag_id
From Users_Tags As U Inner Join Article_Tags As T On (U.Tag_id=T.Tag_id)
                     Inner Join Articles As A On (T.Article_id=A.Article_id)
Where U.User_id='User1'

【讨论】:

    【解决方案2】:

    如果您想要与特定用户有共同标签的文章,试试这个:

    select * from articles A 
    where exists(select 1 from article_tags B 
    where B.article_id = A.article_id and B.tag_id IN 
    (select tag_id from users_tags where user_id = 'User1'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多