我正在处理一个让我发疯的问题。我正试图按联接表中的值搜索表。当前,查询将返回所有具有指定ID的结果。我只希望它返回只有两个ID的记录。
这是我的桌子布置图

creat_table champions do |t|
  t.integer :id
end

create_table champions_champion_combinations do |t|
  t.integer :champion_id
  t.integer :champion_combination_id
end

create_table champion_combinations do |t|
  t.integer :id
end

这是我的问题
SELECT
  champion_combinations.*
FROM champion_combinations
INNER JOIN champions_champion_combinations
  ON champions_champion_combinations.champion_combination_id = champion_combinations.id
INNER JOIN champions
  ON champions.id = champions_champion_combinations.champion_id
WHERE champions.id IN (1, 2)"

从RoR ActiveRecord查询生成
ChampionCombination.joins(:champions).where(champions: {id:[1,2]})

因此,这将返回所有已加入冠军ID 1或2的冠军组合。我需要编写哪种类型的查询,它只返回与ids 1和ids 2连接的组合?
提前谢谢。

最佳答案

如果您对纯SQL解决方案感兴趣,那么可以使用GROUP BYHAVING子句来实现您的目标。下面是sql查询:

SELECT cc.*
FROM champion_combinations AS cc
INNER JOIN champions_champion_combinations  AS ccc ON ccc.champion_combination_id = cc.id
WHERE ccc.champion_id IN (1, 2)
GROUP BY cc.id
HAVING array_agg(ccc.champion_id) @> ARRAY[1,2];

PS感谢@IgorRomanchenko的建议。

关于ruby-on-rails - Postgresql INNER JOIN有多个条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29438037/

10-10 17:22
查看更多