【问题标题】:Rails - search records by groupRails - 按组搜索记录
【发布时间】:2011-04-20 23:16:21
【问题描述】:

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

| 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

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

【问题讨论】:

    标签: sql ruby-on-rails search


    【解决方案1】:
    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

    【讨论】:

    • 感谢您的帮助,是否有基于 Ruby 的方法来实现相同的查询?
    • 更新了我的答案,看看吧。
    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多