Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何查找带有多个标记的帖子_Sql_Ruby On Rails_Postgresql_Activerecord_Rails Postgresql - Fatal编程技术网

Sql 如何查找带有多个标记的帖子

Sql 如何查找带有多个标记的帖子,sql,ruby-on-rails,postgresql,activerecord,rails-postgresql,Sql,Ruby On Rails,Postgresql,Activerecord,Rails Postgresql,我使用postgresql在Rails上有一个非常简单的标记模型: class Tag < ActiveRecord::Base has_many :taggings has_many :posts, :through => :taggings, :source => :tagged, :source_type => 'Post' end class Tagging < ActiveRecord::Base be

我使用postgresql在Rails上有一个非常简单的标记模型:

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :posts, :through => :taggings, 
                   :source => :tagged, :source_type => 'Post'
end

class Tagging < ActiveRecord::Base
  belongs_to :tag 
  belongs_to :tagged, :polymorphic   => true  
end

class Post < ActiveRecord::Base
  has_many :taggings, :as => :tagged
  has_many :tags, :through => :taggings 
end
class标记:标记,
:source=>:标记,:source\u type=>“Post”
结束
类标记true
结束
类Post:标记
有多个:标记,:至=>:标记
结束

有没有一种简单的方法可以找到所有有两个以上指定标签的帖子?例如,假设有“风格”、“男性”、“女性”、“销售”等标签。我想创建一个通用的find语句,它接受一个标记数组。因此,如果输入是[“style”],那么它应该返回带有该标记的所有帖子(easy),或者如果输入是[“style”,“men”],那么它应该返回带有标记“style”和“men”的所有帖子。

我可以在这里写一个非常糟糕的SQL,连接和分组的方法是什么,但这是rails,所以你可以做得更好,首先,您的Post模型的定义如下:

class Post < ActiveRecord::Base
  has_many :taggings, :as => :tagged, :couter_cache => true
  has_many :tags, :through => :taggings 
end
因此,每当为帖子创建标记时,它都会增加标记的计数值,您可以在查询中使用它来高效地查找带有两个或更多标记的帖子:

Post.all( :conditions => [ 'taggings_count >= ?' 2] )

我可以在这里编写一个非常糟糕的SQL连接和分组方法,但这是rails,因此您可以做得更好,首先,您的Post模型应该这样定义:

class Post < ActiveRecord::Base
  has_many :taggings, :as => :tagged, :couter_cache => true
  has_many :tags, :through => :taggings 
end
因此,每当为帖子创建标记时,它都会增加标记的计数值,您可以在查询中使用它来高效地查找带有两个或更多标记的帖子:

Post.all( :conditions => [ 'taggings_count >= ?' 2] )
有没有一种简单的方法可以找到所有有两个以上指定标签的帖子? 例如,假设有“风格”、“男性”、“女性”、“销售”等标签

经典的方法是使用透视表:posts posts\u tags

你可以这样编码你的标签,因为这是最简单的方法(保持完整性,外键,给你一个易于扫描的标签列表,等等)

这种方法对于少量的帖子和少量的标记具有良好的性能,但查询起来很麻烦(每个标记需要一些聚合、相交或一个连接),如果标记不是很有选择性,则速度非常慢

显然,对于您想要执行的搜索类型,这很糟糕。所以你有两个选择:

1-在posts表的INTEGER[]列中具体化post的标记ID列表,在其上放置gist(或gin)索引,并使用“INTEGER array is contained”操作符,该操作符被索引,速度非常快,查询起来非常简单

2-只需将标签作为文本并在其上创建全文索引即可

两者都非常快,对整数数组有好处

有没有一种简单的方法可以找到所有有两个以上指定标签的帖子? 例如,假设有“风格”、“男性”、“女性”、“销售”等标签

经典的方法是使用透视表:posts posts\u tags

你可以这样编码你的标签,因为这是最简单的方法(保持完整性,外键,给你一个易于扫描的标签列表,等等)

这种方法对于少量的帖子和少量的标记具有良好的性能,但查询起来很麻烦(每个标记需要一些聚合、相交或一个连接),如果标记不是很有选择性,则速度非常慢

显然,对于您想要执行的搜索类型,这很糟糕。所以你有两个选择:

1-在posts表的INTEGER[]列中具体化post的标记ID列表,在其上放置gist(或gin)索引,并使用“INTEGER array is contained”操作符,该操作符被索引,速度非常快,查询起来非常简单

2-只需将标签作为文本并在其上创建全文索引即可


两者都非常快,对整数数组有好处。

对不起。。。这不是我想要的。我将编辑我的帖子,使我的问题更清楚:)谢谢。对不起。。。这不是我想要的。我将编辑我的帖子,使我的问题更清楚:)谢谢。