Я думаю, вы можете сделать это в два этапа:
- Найдите команды, в которых есть все игроки, на которых вы смотрите.
- Проверьте, есть ли в этих командах больше игроков, чем указано в наборе игроков.
Это означает:
select team_id
from team_players
where team_id in (
select team_id
from team_players
where player_id in (1,3)
group by team_id
having count(player_id) = 2
)
group by team_id
having count(player_id) = 2
Учитывая это в team_players
:
team_id|player_id
1 | 1
1 | 3
1 | 4
2 | 1
2 | 3
3 | 3
Приведенный выше запрос говорит team_id = 2
, и это ваше точное совпадение. Используемый вами запрос дает вам команды, которые содержат рассматриваемых игроков в качестве подмножества, а не команды, которые по настройке равны рассматриваемым игрокам.
Если вы хотите узнать только, существует ли такая команда, поместите этот запрос в вызов select_rows
и все готово:
class Team < ActiveRecord::Base
# players is an array of Fixnum player IDs
def self.team_exist?(players)
return false if(!players.present?)
connection.select_rows(%Q{
select team_id
from team_players
where team_id in (
select team_id
from team_players
where player_id in (#{players.join(',')})
group by team_id
having count(player_id) = #{players.length}
)
group by team_id
having count(player_id) = #{players.length}
}).present?
end
end
Интерполяция #{players.join(',')}
предполагает, что team_exist?
получает массив Fixnum, поэтому вы захотите правильно очистить ваши данные в вызывающей программе или добавить players = players.map(&:to_i)
перед вызовом connect.select_rows
, чтобы очистить его внутри team_exist?
.