具有多个条件的Postgresql INNER JOIN

时间:2015-04-03 18:52:33

标签: ruby-on-rails postgresql

我正在研究一个令我疯狂的问题。我试图通过连接表中的值搜索表。目前,查询返回具有任一指定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加入的champion_combinations。我需要编写哪种类型的查询,只返回与其连接的ID 1和2的组合?

提前致谢。

2 个答案:

答案 0 :(得分: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提供了很好的建议。

答案 1 :(得分:1)

这不是内连接问题。内部联接正在按预期工作。上面给出的SQL查询使用“champion_combination”进行两个表的内连接,没有限制说明两个id都必须存在。你应该做的是

ChampionCombination.joins(:champions).where(冠军:{id:[1,2]})。where(“champion_id不为null且compion_combination_id不为空”)