这是我的桌子:
电影特许经营:
movie_id franchise_id
1 10
2 11
3 10
4 15
1 11
我想要什么:获取与我的目标电影(例如movie_id - 1)具有相同特许经营权的所有movie_id,但目标电影除外。正如您可能理解的那样,这是基于所选电影的特许经营权获取类似电影的某种查询。
我试过了:
SELECT movie_id
FROM movies_franchises
WHERE franchise_id = ( SELECT franchise_id
FROM movies_franchises
WHERE movie_id = @target_movie_id)
AND movie_id != @target_movie_id;
但我认为这不是一个好习惯。select subquery
此外,如果有多个结果(如果电影有超过 1 个特许经营权),则此查询将不起作用。
所以在这种情况下,如果我想为 movie_id = 1 的电影获取类似的电影,它应该是来自 10 和 11 个特许经营权的所有电影。
如果子查询可以返回多个结果,那么您应该使用
IN
而不是=
. 养成完全限定列来自哪个表的习惯是很好的:你也可以做一个简单的加入。
这不需要任何进一步的内容(例如
distinct
),因为 `(franchise_id, movie_id) 已经是独一无二的。关于“但我认为这不是一个好习惯”,当你想要一个半连接时这种查询很好 - 你只想要一个行源中的列,所以你真的不需要这样做加入。在性能方面,没有哪个更好的规则,而且它们很有可能会使用相同的执行计划来执行。这并不是说你不会找到(非常自信的)建议,说你应该只以一种特定的方式去做。最好的查询成为最容易阅读和维护的查询(这是你老板决定的;))。