2012-06-15 2 views
1

Привет я следующий запрос:Rails 3 Улучшение Active Record Query Performance

Player.select("Players.*, (SELECT COUNT(*) FROM Results WHERE Results.player_id = Players.id and win = true and competition_id = 4) as wins").where("competition_id = 4").order("wins desc") 

По сути это подсчет и упорядочения записей игрока на основе его внешнего ключа вхождений в таблице результатов, где победа устанавливается истина для конкретного соревнование. Чтобы дать вам лучшее представление некоторых примеров данных из таблицы результатов могут быть ...

Player_ID | Match_ID|Win|Elapsed_Time|etc.. 
1   | 1 |T | 1:00  |etc.. 
2   | 1 |F | 1:00  |etc.. 
1   | 2 |T | 3:00  |etc.. 
3   | 2 |F | 3:00  |etc.. 

Как вы можете видеть два Выбирается происходит в этом заявлении, которое я имею в виду может привести к падению производительности в будущем. У игроков на самом деле есть отношения «один-много» с результатами, как вы могли догадаться, но я не мог понять, как сделать эту работу с объединением, которое, я думаю, может быть более эффективным.

Возможно, я ошибаюсь и никаких проблем с вышеуказанным запросом не возникает - в любом случае, пожалуйста, предоставьте несколько советов.

Я использую базу данных PostgreSQL.

ответ

0

Возможно, что-то вроде этого?

Player.joins(:results).where("results.win = true AND results.competition_id = 4").order("results.count DESC") 
+0

Привет, я получаю сообщение об ошибке: ** PGError: ОШИБКА: колонка «results.id» должен появиться в GROUP BY оговорки или использоваться в агрегатной функции ** для пункта заказа в конце – Noz

+0

Помогает ли это? http://stackoverflow.com/questions/10066041/heroku-pgerror-error-column-must-appear-in-the-group-by-clause-or-be-used-i – Salil

+0

Я не использую Героку, я на самом деле уже на PG 9.1. На самом деле, как выясняется, вышеприведенный запрос не выполнит точно, что мне нужно [см. Здесь] (http://stackoverflow.com/questions/11105002/rails-3-select-query-wont-work), поэтому необходимы изменения так или иначе. Я думаю, что присоединение может быть маршрутом, который я должен принять – Noz