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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.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 Rails-按组搜索记录_Sql_Ruby On Rails_Search - Fatal编程技术网

Sql Rails-按组搜索记录

Sql Rails-按组搜索记录,sql,ruby-on-rails,search,Sql,Ruby On Rails,Search,我想构造一个搜索查询,根据记录的“tag”属性对记录进行分组,并为每个标记组查找一定数量的记录。我的“位置”表如下: | ID | name | geom | rating_av | tag | 有四个不同的标签,一个地方可以分配-城市,食品,酒店和景点。我希望我的搜索能够返回每个标签组的前五条记录,按评级_av排序,并附加一个几何约束。我可以使用以下方法一次查询每个标记,看起来效果不错: Place.find(:all, :limit => 5, :conditions => [

我想构造一个搜索查询,根据记录的“tag”属性对记录进行分组,并为每个标记组查找一定数量的记录。我的“位置”表如下:

| ID | name | geom | rating_av | tag |
有四个不同的标签,一个地方可以分配-城市,食品,酒店和景点。我希望我的搜索能够返回每个标签组的前五条记录,按评级_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"])
但是,我希望能够在单个查询中检索每个标记的前五条记录。构造这样一个查询的最佳方法是什么?我是否应该考虑添加“tag”列作为索引以帮助搜索?我尝试将:group=>'tag'添加到查询中,但我不太确定如何正确使用它,因为我返回了以下错误:

ActiveRecord::StatementInvalid (PGError: ERROR:  column "places.id" must appear in the GROUP BY clause or be used in an aggregate function
非常感谢您的帮助,谢谢

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"
)

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

感谢您的帮助,是否有基于Ruby的方法实现相同的查询?更新了我的答案,请查看。