我正在研究一个令我疯狂的问题。我试图通过连接表中的值搜索表。目前,查询返回具有任一指定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的组合?
提前致谢。
答案 0 :(得分:2)
如果您对纯SQL解决方案感兴趣,那么您可以使用GROUP BY和HAVING子句来实现您的目标。这是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不为空”)