2010-10-04 87 views
1

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

| 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 

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

回答

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

+0

感谢您的帮助,是否有一个基于Ruby的方法来实现相同的查询? – Budgie 2010-10-04 19:58:49

+0

更新了我的答案,看看。 – 2010-10-04 21:59:15

+0

真棒,欢呼! – Budgie 2010-10-05 07:37:51