如何使用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,按它们共享标签的数量顺序!     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...