我的模型结构:电影has_many :captions
。字幕的语言可以是“ en”,“ de”,“ fr” ...
问题: 一个有效的查询,用于选择没有字幕的电影。
需要上述功能的应用程序可以在Rails上运行,为此,我目前在Caption模型中使用的是这样的内容:
def self.ids_of_movies_without_caption_in_en
a = (1..(Movie.last.lp.to_i)).to_a
b = Caption.in_lang("en").collect {|h| h.movie_id }
(a - b)
end
如您所见,我收集了所有电影的ID(lp),然后从该数组中删除了字幕为“ en”作为语言的那些电影的ID。结果是我需要的电影ID数组。
上面的方法有效,但可以想象,它相当“沉重”。我相信,有一种更好的(也许是微不足道的)方法。但是,由于对SQL感到“新鲜”,我要求编写有效查询的指导。它可以在PostgreSQL上运行
在Rails(5.2)中实施将是额外的好处!
这种情况::假设数据库中有1000部电影,而这些电影有4000个字幕。当然,有些电影没有字幕。在这4000个字幕中,有400个是“ en”语言的。我要查询的查询将返回600部电影,其中“ en”中的字幕不存在(包括具有0个字幕的电影)。
答案 0 :(得分:0)
这在SQL中非常容易。我不太确定这些表是什么样子,但是像这样:
select movie_id
from captions
group by movie_id
having not bool_or(language = 'en');
如果您想要没有字幕的电影,请使用not exists
:
select m.movie_id
from movies m
where not exists (select 1
from captions c
where c.movie_id = m.movie_id and
m.language = 'en'
);