Rails - 按组搜索记录

时间:2010-10-04 18:55:26

标签: sql ruby-on-rails search

我想构建一个搜索查询,按照“tag”属性对记录进行分组,并为每个标记组查找一定数量的记录。我的'地方'表格如下:

| ID | name | geom | rating_av | tag |

可以分配四个不同的标签 - “城市”,“食物”,“酒店”和“景点”。我希望我的搜索能够返回每个标记组的前五个记录,按rating_av排序,并附加几何约束。我可以使用以下内容一次查询每个标记(这似乎工作正常):

Place.find(:all, :limit => 5, :conditions => ["geom && ? and tag = ?", Polygon.from_coordinates([[[xMinLng, yMinLat], [xMinLng, yMaxLat], [xMaxLng, yMaxLat], [xMaxLng, yMinLat], [xMinLng, yMinLat]]], 4326), "food"])

但是,我希望能够在单个查询中检索每个标记的前五个记录。构建此类查询的最佳方法是什么?我是否应考虑将“标记”列添加为帮助搜索的索引?我尝试将:group => 'tag'添加到查询中,但我不太确定如何正确使用它,因为我收到了以下错误:

ActiveRecord::StatementInvalid (PGError: ERROR:  column "places.id" must appear in the GROUP BY clause or be used in an aggregate function

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

Place.all(
  :joins => "INNER JOIN (
      SELECT     a.id, COUNT(*) AS ranknum
      FROM       places AS a
      INNER JOIN places AS b ON (a.tag = b.tag) AND (a.rating_av <= b.rating_av)
      GROUP BY   a.id
      HAVING COUNT(*) <= 5
    ) AS d ON (places.id = d.id)",
:order => "places.tag, d.ranknum"
)

有关此查询的详细说明,请查看此article