这是不使用您显示的子查询方法来执行此查询的典型方法。这可以满足@Godeke的要求,以查看基于联接的解决方案。
SELECt * FROM movies m LEFT OUTER JOIN seen s ON (m.id = s.movie_id AND s.user_id = 123)WHERe s.movie_id IS NULL;
但是,在大多数品牌的数据库中,此解决方案的性能可能比子查询解决方案差。最好使用EXPLAIN来分析两个查询,以查看在您的模式和数据下哪个查询会更好。
这是子查询解决方案的另一个变体:
SELECt * FROM movies mWHERe NOT EXISTS (SELECt * FROM seen s WHERe s.movie_id = m.id AND s.user_id=123);
这是一个相关的子查询,必须为外部查询的每一行进行评估。通常这很昂贵,并且您的原始示例查询更好。另一方面,在MySQL中,“
NOTEXISTS”通常比“
column NOT IN (...)” 更好
同样,您必须测试每个解决方案并比较结果以确保确定。 在不衡量性能的情况下选择任何解决方案都是浪费时间。



