2010-10-04 4 views
1

Je voudrais construire une requête de recherche qui regroupe les enregistrements par leur attribut 'tag', et trouve un certain nombre d'enregistrements pour chaque groupe de variables. Ma table « place » est la suivante:Rails - rechercher des enregistrements par groupe

| ID | name | geom | rating_av | tag | 

Il y a quatre différentes balises qu'un lieu peut être attribuée - « ville », « nourriture », « hôtel » et « attraction ». Je souhaite que ma recherche puisse renvoyer les cinq premiers enregistrements de chaque groupe de balises, classés par rating_av, avec une contrainte géométrique supplémentaire. Je peux interroger chaque étiquette à la fois avec les éléments suivants (qui semble fonctionner très bien):

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

Cependant, je voudrais être en mesure de récupérer les cinq premiers enregistrements pour chaque balise dans une seule requête. Quelle est la meilleure façon de construire une telle requête? Dois-je penser à ajouter la colonne 'tag' en tant qu'index pour faciliter la recherche? Je l'ai essayé d'ajouter :group => 'tag' à la requête, mais je ne suis pas trop sûr comment l'utiliser correctement, comme je l'ai l'arrière erreur suivant:

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

Toute aide est grandement appréciée, merci!

Répondre

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

Pour une explication détaillée de cette requête, regardez article.

+0

Merci pour l'aide, existe-t-il une méthode basée sur Ruby pour réaliser la même requête? – Budgie

+0

Mis à jour ma réponse, jetez un oeil. –

+0

Génial, bravo! – Budgie

Questions connexes