通过关系对具有完全相同的has_many的模型进行组合

问题描述 投票:1回答:2

请原谅我,如果之前有人询问,我很难想到好的搜索查询。

可以说我有2个模型,帖子和标签。帖子通过枢轴模型PostTags有很多标签。

我想要做的是组合具有完全相同的标签组合的帖子。我知道如何对具有任何相同标签的帖子进行分组,但我在这方面遇到了困难。

例如,如果我有一个ID为1的帖子,并且帖子有两个标签 - 一个ID为5,另一个ID为7.我将有2个PostTag,一个post_id为1,以及tag_id为5,然后是另一个post_id为1且tag_id为7.我有另一个id为3的帖子,它还有2个PostTag - 一个post_id为3,tag_id为5,另一个为post_id为3,tag_id为7.我想将这些组合在一起,这样我就可以计算出这些标签中有多少个帖子,而没有其他帖子。

谢谢,我希望我能够正确解释这一点。

ruby-on-rails postgresql psql
2个回答
1
投票

我想你可以在嵌套查询中做这样的事情:

SELECT tag_ids,
       string_agg(post_id, ',')
FROM (
  SELECT post_id,  
         string_agg(tag_id, ',') as tag_ids
  FROM post_tags
  GROUP BY post_id)
GROUP BY tag_ids;

说明:

首先在内部查询中,您连接由post_id分组的tag_ids,这样您就可以获得每个帖子的标签组合。

然后在外部查询中,通过tag_ids的组合连接post_ids,这样就可以获得每个标记组合的所有post_id。

这可能还不是结束,您可以进一步处理post id,或修改查询以获取所需的任何数据。

希望这有帮助!


0
投票

希望模型关系设置正确。

# Post Model
class Post
  has_many :post_tags
  has_many :tags, through: :post_tags
end

# Fetch Tags to match with posts collection
tag_ids = []

# Query to fetch posts
Post.joins(:tags).where(tags: { id: tag_ids }).
  group("posts.id").having("count(posts.id) >= ?", tag_ids.size)
  1. 第一行确保仅提取指定标记列表中包含标记的帖子
  2. 第二行确保帖子具有两个标签。
  3. 如果要匹配精确标签(不应出现其他标签),则将条件更改为=而不是>=

快乐黑客!

© www.soinside.com 2019 - 2024. All rights reserved.