2015-09-06 3 views
2

У меня есть достаточно сложный запрос в приложении rails, Я присоединяюсь к таблице A и таблице B, чтобы я мог тщательно искать обе таблицы. Затем я группирую таблицу A в свой идентификатор, чтобы удалить дубликаты по моему внутреннему соединению на таблице B Затем мне требуется подсчет оставшихся записей, чтобы я мог разбивать на страницы результаты.Получить общие строки в объединенном и сгруппированном запросе

Однако делать это дает мне следующее исключение при попытке получить количество:

ActiveRecord::StatementInvalid (PG::AmbiguousColumn: ERROR: column reference "game_id" is ambiguous 
LINE 1: SELECT COUNT(*) AS count_all, game_id AS game_id, region AS ... 
            ^
: SELECT COUNT(*) AS count_all, game_id AS game_id, region AS region FROM "game_data" INNER JOIN "player_participants" ON "player_participants"."game_id" = "game_data"."game_id" WHERE "player_participants"."region" = $1 AND "game_data"."region" = 'NA1' AND "game_data"."status" = 1 GROUP BY "game_data"."game_id", "game_data"."region"): 

Вот мой код рельсы:

games = GameDatum.joins(:player_participants).where(
    player_participants: pp_data, 
    game_data: g_data 
).group(:game_id).order(created_at: :desc).page(page).per(records) 

games_json = {} 
games_json[:pages] = games.total_pages 

games.total_pages использует .Count, который является то, что дает мне проблемы.

Спасибо за помощь!

ответ

3
ERROR: column reference "game_id" is ambiguous 

Похоже, у вас есть game_id столбец в обеих ваших таблицах. Поэтому в вашем запросе используйте соглашение table_name.column_name. Используйте .group('player_participants.game_id') вместо group(:game_id), если вы хотите использовать game_id из player_participants таблицы:

games = GameDatum 
    .joins(:player_participants) 
    .where(player_participants: pp_data, game_data: g_data) 
    .group('player_participants.game_id') 
    .order(created_at: :desc) 
    .page(page) 
    .per(records) 
+1

Спасибо, исправлено! –

+0

Удивительный, рад, что это сработало для вас :) –

0

От чистого SQL ответа, вопрос о том, что game_id появляется в обеих таблицах, так что вы должны быть конкретными в запросе к что для использования таких как:

SELECT COUNT(*) AS count_all, "player_participants".game_id AS game_id, region AS region FROM "game_data" INNER JOIN "player_participants" ON "player_participants"."game_id" = "game_data"."game_id" WHERE "player_participants"."region" = $1 AND "game_data"."region" = 'NA1' AND "game_data"."status" = 1 GROUP BY "game_data"."game_id", "game_data"."region" 

Поэтому я хотел бы предложить вам попробовать добавить table.column_name к вашей группе, например:

.group («player_participants.game_id»)

Жаль, что я не могу помочь.

Смежные вопросы