Rails - поиск записей по группам - PullRequest
1 голос
/ 04 октября 2010

Я хотел бы создать поисковый запрос, который группирует записи по их атрибуту '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 Ответ

0 голосов
/ 04 октября 2010
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"
)

Для подробного объяснения этого запроса посмотрите эту статью .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...