如何使用SQL或Sphinx查找相关的带标记的记录

|| 我有一个包含很多故事的应用程序 每个故事都有并且属于许多标签(使用行为作为标签) 每个故事也通过思考狮身人面像索引 我需要的是按标签查找彼此相关的故事,并按它们共享多少标签的顺序进行排序。 给定以下数据: 故事#1标记为a,b,c,d 故事#2标有 故事#3标记为b,a 故事#4带有d,c,b标签 Story.find(1).related#=>故事4,故事3,故事2 ...以该顺序 有人可以为此建议一个好方法吗?我想有一种使用SQL的简单方法,但我不是SQL超人 谢谢 博     
已邀请:
        这应该做。
Story.find(1).find_related_tags
    
        不确定您的数据库到底是什么样子,但我假设它看起来像:
stories:
  id
  content

tags:
  id
  name

story_tags:
  story_id
  tag_id
尝试先运行查询,看看是否能给您预期的结果:
SELECT stories.id, COUNT(*) AS ordering FROM stories 
  INNER JOIN story_tags ON story_tags.story_id = stories.id 
  WHERE story_tags.tag_id IN (\'id of tag a\', \'id of tag b\', \'id of tag c\', \'id of tag d\') 
  GROUP BY stories.id
  ORDER BY ordering DESC;
    
        这是我最终解决此问题的方法:
class MyModel < ActiveRecord::Base

  scope :related_to, lambda { |record|
    joins(:tags,:taggings).
    where(record.class.model_name == self.model_name ? [\"#{table_name}.id != ?\", record.id] : \"\").
    where(\"tags.id IN (SELECT taggings.tag_id from taggings where taggable_type = ? and taggable_id = ?)\", record.class.model_name, record.id).
    order(\"count(DISTINCT(tags.id)) DESC\").
    group(\"#{table_name}.id\")
  }

end
这意味着我可以:   @ blog_post.related_to(@ad)#=>返回所有与@ad具有相同标签的@blog_posts,按它们共享标签的数量顺序!     

要回复问题请先登录注册