根据联接表中的属性(没有特定值)优化SQL查询

时间:2019-03-10 10:44:08

标签: sql ruby-on-rails

我的模型结构:电影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个字幕的电影)。

1 个答案:

答案 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'
                 );