代码之家  ›  专栏  ›  技术社区  ›  Budgie

Rails-按组搜索记录

  •  1
  • Budgie  · 技术社区  · 14 年前

    我想构造一个搜索查询,该查询按记录的“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 回复  |  直到 14 年前
        1
  •  0
  •   Harish Shetty    14 年前
    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 .